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

出力には「list contains:」のみが表示され、その後は何も表示されません。insert() メソッドを使用して手動で試したので、出力ループが正しく機能することはわかっています。したがって、問題は generate_n 関数に関係しています。引数を間違って渡していると思います。私が何をしたか知っている人はいますか?

4

2 に答える 2

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';
于 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 に答える