2

次のコードを手伝ってください。ベクトルに文字列の長さを追加する必要があります。ブーストでそれを達成する方法がわかりません。これまでの私の最高のアイデアは次のとおりです。

boost::bind(add2Vect, boost::ref(lengths), L::_1)

ここで、add2Vectは、ベクトルと文字列を受け取り、文字列の長さをベクトルに追加する単純な関数です。Lはboost::lambdaの省略形です

しかし、離散関数を作成する必要があるため、このソリューションは良くありません。それはラムダがどうあるべきかではありません。

コード:

vector<string> strings;
strings.push_back("Boost");
strings.push_back("C++");
strings.push_back("Libraries");

vector<int> lengths;

for_each(strings.begin(), strings.end(),    
    // add lengths of strings to the vector 'lengths'

);

for_each(lengths.begin(), lengths.end(), 
    cout << L::_1 << " "
);  
4

1 に答える 1

2

Boost.Bind と Boost.Lambda は同じものではありません。boost::lambda::bind を使用していない限り、バインドでラムダ プレースホルダーを使用することはできません。

これがあなたが望むと思われることをする方法です:

std::transform(strings.begin(), strings.end(), std::back_inserter(lengths), 
               boost::bind(&std::string::size, _1));

本当に for_each を使用する必要がある場合:

std::for_each(strings.begin(), strings.end(), 
             boost::bind(&std::vector<int>::push_back,
               &lengths, boost::bind(&std::string::size, _1)));

ただし、int ではなく size_t を使用する必要があります。

于 2012-05-05T21:48:49.033 に答える