C++函数,接受一个输出迭代器并向其中写入内容

3
我正在尝试编写一个C++函数,它接受一个OutputIterator并向其写入值,但我遇到了各种问题。当我传递一个list<>迭代器时,列表没有填充,当我传递一个vector<>迭代器时,在Linux上会出现分段错误。我遵循了从"通过传递输出迭代器从函数中填充std :: [容器]的讨论""如何编写以通用方式接受迭代器或集合的函数?"中得到的建议。有什么想法吗?我想使用输出容器的begin()调用insertValues()代码,就像我使用其他STL函数(如std:copy())一样。
#include <cstdio>
#include <list>
#include <vector>

using namespace std;

template<typename OutputIterator>
void insertValues(OutputIterator result)
{
    for (int i = 0; i < 10; i++)
    {
        *(result++) = i;
    }
}

int main(int argc, char **argv)
{
    // This code produces 0 items in the list.
    list<int> values_list;
    insertValues(values_list.begin());
    printf("values has %d items\n", (int) values_list.size());

    // This code produces a seg fault.
    vector<int> values_vector;
    insertValues(values_vector.begin());
    printf("values has %d items\n", (int) values_vector.size());
}

你可以提出问题,但不要忘记接受答案。通过点击“打勾”符号来接受最令人满意的答案。 - Nawaz
1个回答

11

你的代码出现了问题,因为列表和向量都没有足够的元素。请注意,输出迭代器不会“添加”元素,它只是写入“现有”的元素。

因此,您可以将其重写为以下内容:

template<typename Container>
void insertValues(Container &result)
{
    for (int i = 0; i < 10; i++)
    {
        result.push_back(i);
    }
}

并且在 main 函数中:

insertValues(values_list);
insertValues(values_vector);

或者,您可以使用执行push_back操作的迭代器。 这在标准库中以back_inserter的名称存在(#include <iterator>)。 使用它,而不修改您的insertValues代码:

insertValues(back_inserter(values_list));
insertValues(back_inserter(values_vector));

谢谢您的帮助。我还没有看到调用使用OutputIterator的函数的调用者代码。 - stackoverflowuser2010

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接