2013-10-05 68 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'; 
相關問題