2013-10-05 50 views
1

我在制作一个使用std::generate_n function的程序。我可以让它与数组一起工作,但我无法弄清楚如何使它与列表容器一起工作。这里是我有: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函数有关。我想我错了。任何人都知道我做了什么?

+0

[避免'使用命名空间std'](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) – Manu343726

+0

使用'std :: generate_n(std :: back_inserter(L),9,UniqueNumber)',除非你h在全局命名空间中为未来的'current'计划,你可以使它对'UniqueNumber()'是静态的。 – WhozCraig

回答

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); 
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'; 
相关问题