2010-12-02 10 views
1

私は次のコードの多くの例があります:どのように私はそれがfoo2は、新しいベクトルを埋めるのコードを向上させることができます異なるタイプのイテレータでベクトルをどのように埋めることができますか?

struct foo1 
{ 
    foo1(int ii = 0, int jj = 0) 
    { 
     this->ii = ii; 
     this->jj = jj; 
    } 

    int ii; 
    int jj; 
}; 

struct foo2 
{ 
    foo2() 
    { 
    } 

    foo2(const foo1& f) 
    { 
     this->f = f; 
    } 

    foo1 f; 
}; 
typedef std::vector<foo2> foo_v; 

typedef std::set<int> bar_s; 

bar_s barSet; 
barSet.insert(1); barSet.insert(2); barSet.insert(3); 
barSet.insert(4); barSet.insert(5); barSet.insert(6); 

... 

foo_v fooVec; 
for (bar_s::iterator b = barSet.begin(); b != barSet.end(); ++b) 
    fooVec.push_back(foo2(*b)); 

を?

私はの線に沿って何かを考えていた:

std::remove_copy_if(barSet.begin(), barSet.end(), 
        std::back_inserter(fooVec), ...) 

を私はfoo2構造体の新しいインスタンスにintタイプをバインドする方法を見つけるのに苦労しています。


注:

エラー1つのエラーC2679:バイナリ '=':

std::copy(barSet.begin(), barSet.end(), std::back_inserter(fooVec)); 

は私に次のエラーを与える何のオペレータが」タイプの右辺のオペランドをとる見つかりませんint "(または許容される変換はありません)

+0

'bar_s'のイテレータを参照解除すると、' int'が返されます。さて、 'int'はすでに' foo'に変換できるので、 'bar_s'のイテレータの背後にある値を' foo_v'に挿入できるはずです – Mephane

答えて

3
std::copy(barSet.begin(), barSet.end(), std::back_inserter(fooVec)); 

int is converta 'foo'にする(唯一のコンストラクタは1つのint引数で呼び出すことができ、明示的ではない)。

これは、foo2からintへの変換ができず、foo1からの変換であり、暗黙の変換のステップが1つしかないからです。あなたははstdすることができます::変換:

std::transform(barSet.begin(), barSet.end(), 
       std::back_inserter(fooVec), 
       boost::lambda::constructor<foo2>()); 

ブースト::ラムダ::コンストラクタ()はstd :: fun_ptr(makeFoo2)に置き換えることができます。

foo2 makeFoo2(const foo& f) { return f; } 
+0

申し訳ありません、私は上記のコードを修正しました。複数のコンストラクタをコーディングします。 – Alan

+0

問題ありません。 fooには1つのint引数で呼び出すことができるコンストラクタがあります。さらに別のコンストラクタを追加することができます。二重や文字列、あるいは何でも、intからfooを暗黙的に構築することができます(さらにdouble、stringなどから)。 – Begemoth

+0

STLコンテナには2つのイテレータのコンストラクタもあります。これにより、別のコンテナの指定範囲がコピーされます。 – Begemoth

0

あなたはベクトルのコンストラクタを使用することができますこれはイテレータのペアを取ります。 fooのコンストラクタを考える

foo_v fooVec(barSet.begin(), barSet.end()); 

intfooに暗黙的に変換されます。

+0

謝罪を使用するときに得られるコンパイルエラーも与えましたが、私の例は間違っていました。私は自分のコードを修正しました。 – Alan

関連する問題