2016-07-31 5 views
1

私はstd :: transform関数の仕組みを理解しようとしていますが、次のコードで少し問題があります。私はマルチセットmsを取って、各要素の内容に1を加え、新しいマルチセットmscにそれらを格納したいと思います。ここで私が持っているものです。私はエラーを与えるmultisetのstd :: transform C3892

int op_increase(int i) { return ++i; } 

int main() 
{ 

std::multiset<int> ms = {1,1,2,2,3}; 
std::multiset<int> msc; 
std::transform(ms.begin(), ms.end(), msc.begin(), op_increase); 

return 0; 
} 

私は次のエラーを取得するしかし:

C3892:_DEST:あなたはここでの問題はstd::multiset<T>::begin()std::_Tree_const_iteratorを返すということですconstの

+0

これは_runtimeエラーではありません。 –

答えて

3

あなたのコードは、空の容器への挿入を可能にstd::transformに正しい引数を利用していませんでした。これには、インテリジェントなイテレータを使用して、コンテナの関数を呼び出す適切な関数を呼び出す必要があります。

解決策は、multisetに自動的に挿入されるstd::inserterイテレータを提供することです。次に例を示します。

#include <set> 
#include <algorithm> 
#include <iterator> 

int op_increase(int i) { return ++i; } 

int main() 
{ 
    std::multiset<int> ms = {1,1,2,2,3}; 
    std::multiset<int> msc; 
    std::transform(ms.begin(), ms.end(), std::inserter(msc, msc.begin()), op_increase); 
    // msc now contains 2,2,3,3,4 
} 

std::inserterが使用されている注意事項はなく、単にmsc.begin()。インサータは自動的にアイテムをマップに挿入します。

Live Example

+0

ありがとう、それはうまくいった! – lebman

2

ある変数に代入することはできませんタイプ。だからあなたはその価値を変えることができません。この動作は分かりやすいです:std::multisetは、std::setのように、典型的には赤黒のツリーとして実装されたソートされたコンテナです。したがって、1つの要素の値を変更すると、データ構造全体が更新されることがあります。ユーザーが実際にこれをしたい場合、ノードを消去して戻すことがあります。

std::transformの動作をよりよく理解するために、std::multisetの代わりにstd::vectorコンテナを使用できます。 Cplusplus.comには、std::transformを使用したコードの良い例が含まれています。

また、あなたのコードからわかるように、最初に空のstd::multisetに結果データを追加しようとします。この機能を実現するには、このように、std::insert_iteratorCplusplus.com)を使用することがあります。

int op_increase(int i) { return ++i; } 

int main() 
{ 
    std::multiset<int> ms = {1,1,2,2,3}; 
    std::multiset<int> msc; 
    std::transform(ms.begin(), ms.end(), inserter(msc, msc.begin()), op_increase); 
    return 0; 
} 
+1

ありがとう、だから私はマルチセットでstd :: transformを使用したいのですが? – lebman

+0

私は例をcplusplus.comに載せ​​て見ましたが、私はそれを理解することができますが、私は割り当てのために特別にこのようにする必要があります。 – lebman

+0

@lebman - あなたの割り当ては間違っています。挿入を行うのに十分スマートなイテレータを使わずに空のコンテナにアイテムを挿入するために 'std :: transform'を使うことはできません。 – PaulMcKenzie

関連する問題