带列表的std :: generate_n函数

时间:2013-10-05 23:01:38

标签: c++ list containers

我正在制作一个使用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函数。我想我错误地传递了这些论点。谁知道我做了什么?

2 个答案:

答案 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_ninsert,它只是取消引用和分配。

请参阅以下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);