2011-01-24 14 views
1

OutputIteratorをとり、値を書き込むC++関数を記述しようとしていますが、さまざまな問題が発生しています。リスト<>イテレータを渡すと、リストは埋められません。ベクトル<>イテレータを渡すと、(Linux上で)セグメント化エラーが発生します。OutputIteratorをとり、それに書き込むC++関数

私は"populating an std::[container] from a function by passing an output iterator""How to write a function that takes an iterator or collection in a generic way?"からの議論に続きました。

アイデア?私は他のSTL関数std:copy()と同じように、出力コンテナのbegin()でinsertValues()コードを呼び出したいと思います。

#include <cstdio> 
#include <list> 
#include <vector> 

using namespace std; 

template<typename OutputIterator> 
void insertValues(OutputIterator result) 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     *(result++) = i; 
    } 
} 

int main(int argc, char **argv) 
{ 
    // This code produces 0 items in the list. 
    list<int> values_list; 
    insertValues(values_list.begin()); 
    printf("values has %d items\n", (int) values_list.size()); 

    // This code produces a seg fault. 
    vector<int> values_vector; 
    insertValues(values_vector.begin()); 
    printf("values has %d items\n", (int) values_vector.size()); 
} 
+0

あなたは質問しますが、回答は受け付けません。 "tick"記号をクリックすると、最も満足度の高い回答を受け入れることができます。 – Nawaz

答えて

10

リストやベクターに十分な要素がないため、コードが壊れます。出力イテレータはを追加せず、要素を追加するだけで、の既存の要素に書き込むことに注意してください。次のように

したがって、あなたはそれを書き換えることができ:

template<typename Container> 
void insertValues(Container &result) 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     result.push_back(i); 
    } 
} 

mainで:

insertValues(values_list); 
insertValues(values_vector); 

代わりに、push_back動作を行う反復子を使用することができます。これは、標準ライブラリーのback_inserter#include <iterator>)という名前です。それを使用してinsertValuesコードを変更しないでください:

insertValues(back_inserter(values_list)); 
insertValues(back_inserter(values_vector)); 
+0

助けてくれてありがとう。私は、OutputIteratorを使用する関数を呼び出すための呼び出し側コードを見たことがありません。 – stackoverflowuser2010

関連する問題