std::generate_n 带有列表的函数

std::generate_n function with list

本文关键字:列表 函数 generate std      更新时间:2023-10-16

我正在制作一个使用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 函数上。我想我把论点传递错了。有人知道我做了什么吗?

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

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

generate_ninsert,它只是取消引用和赋值。

请参阅下面可能的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);