1

vector<Wrap>と同じ値で作成しようとしていますv。以下の組み合わせを試してみましたが、うまくいきませんでした!

using namespace std;

struct Wrap
{
  int data;
  //Other members
};

int main()
{
  int a[10] = {2345,6345,3,243,24,234};
  vector<int> v(&a[0],&a[10]);
  Wrap w;
  //Populate other members of w
  vector<Wrap> vw;
  using namespace boost::lambda;
  //transform(v.begin(),v.end(), back_inserter(vw), (bind(&Wrap::data,&w,_1), boost::lambda::constant(w)));
  //transform(v.begin(),v.end(), back_inserter(vw), bind(&Wrap::data,&w,_1), boost::lambda::constant(w));
  //transform(v.begin(),v.end(), back_inserter(vw), ((w.data = _1), boost::lambda::constant(w)));
  //transform(v.begin(),v.end(), back_inserter(vw), ((w.data = _1), w));
  cout << vw.size() << endl;
  BOOST_FOREACH(Wrap w, vw)
  {
    cout << w.data << endl;
  }
}

注: C++11 はまだ使用できません

更新C++03 で動作するクリーンなソリューションは問題ありません。ブーストラムダを使用する必要はありません

4

2 に答える 2

1

std::transform()二項演算関数を使用して指定します。例えば:

#include <iostream>
#include <vector>
#include <algorithm>

struct Wrap
{
    int data;
};

Wrap set_data(int a_new_data, Wrap a_wrap)
{
    a_wrap.data = a_new_data;
    return a_wrap;
}

int main()
{
    int a[10] = { 2345, 6345, 3, 243, 24, 234 };
    const size_t A_SIZE = sizeof(a) / sizeof(a[0]);
    std::vector<Wrap> vw(A_SIZE);

    std::transform(a, a + A_SIZE, vw.begin(), vw.begin(), set_data);

    std::cout << vw[0].data << ','
              << vw[1].data << ','
              << vw[5].data << ','
              << vw[9].data << '\n';
    return 0;
}

http://ideone.com/DHAXWsでデモを参照してください。

于 2013-01-17T10:24:12.210 に答える
1

次のコンストラクタを定義する必要がありますWrap

struct Wrap
{
  Wrap(int data): data(data) {}
  int data;
};

そして、これを簡単に行うことができます:

transform(v.begin(),v.end(), back_inserter(vw), constructor<Wrap>());

constructorから来てboost/lambda/construct.hpp、コンストラクターを関数オブジェクトとしてラップします。

于 2013-01-17T10:01:12.040 に答える