C ++函数,它接受一个OutputIterator并写入它

时间:2011-01-24 19:42:26

标签: c++ iterator

我正在尝试编写一个C ++函数,它接受一个OutputIterator并将值写入其中,但是我遇到了各种各样的问题。当我传入一个列表<>迭代器,列表未填充,当我传入向量<>迭代器,我得到一个分段错误(在Linux上)。

我关注了"populating an std::[container] from a function by passing an output iterator""How to write a function that takes an iterator or collection in a generic way?"的讨论。

有什么想法吗?我想用输出容器的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());
}

1 个答案:

答案 0 :(得分:10)

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

因此,您可以按如下方式重写它:

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));