我正在尝试编写一个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());
}
答案 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));