我正在制作一个使用std::generate_n
function的程序。我可以使它与数组一起正常工作,但我无法弄清楚如何使它与列表容器一起工作。这就是我所拥有的:
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
int current = 0;
int UniqueNumber () { return ++current; }
int main ()
{
list<int> L;
list<int>::iterator it;
generate_n (L.begin(), 9, UniqueNumber);
cout << "list contains:";
for (it=L.begin(); it!=L.end(); ++it)
cout << ' ' << *it << '\n';
return 0;
}
输出只显示“list contains:”,之后没有任何内容。我知道我的输出循环正常工作,因为我用insert()方法手动尝试,所以问题是generate_n函数。我想我错误地传递了这些论点。谁知道我做了什么?
答案 0 :(得分:3)
您想使用insert-iterator将项添加到列表中:
generate_n (back_inserter(L), 9, UniqueNumber);
务必#include <iterator>
使用它。另一种可能性是使用std::iota
:
list<int> L(10);
std::iota(L.begin(), L.end(), 1);
哦,要显示列表的内容,您可能需要:
std::copy(L.begin(), L.end(), ostream_iterator<int>(std::cout, "\n"));
或(在C ++ 11中):
for (auto i : L)
std::cout << ' ' << i << '\n';
答案 1 :(得分:0)
generate_n
不insert
,它只是取消引用和分配。
请参阅以下generate_n
的可能实施方式(从here复制):
template< class OutputIt, class Size, class Generator >
OutputIt generate_n( OutputIt first, Size count, Generator g )
{
for( Size i = 0; i < count; i++ ) {
*first++ = g();
}
return first;
}
因此,在调用之前,您需要确保列表的大小合适。
所以,改变:
list<int> L;
为:
list<int> L(9);