1

我正在制作一个使用该std::generate_n功能的程序。我可以让它与数组一起正常工作,但我不知道如何使它与列表容器一起工作。这是我所拥有的:

#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;
}

输出仅显示“列表包含:”,之后没有任何内容。我知道我的输出循环功能正确,因为我使用 insert() 方法手动尝试了它,所以问题出在 generate_n 函数上。我想我传递的论点是错误的。有谁知道我做了什么?

4

2 回答 2

3

您想使用插入迭代器将项目添加到列表中:

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';
于 2013-10-05T23:22:37.400 回答
0

generate_n没有insert,它只是取消引用和分配。

请参阅以下可能的实现(从此处generate_n复制):

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);
于 2013-10-05T23:07:19.223 回答