0

std::map<std::string, Foo>からを構築するにはどうすればよいstd::vector<std::pair<std::string, Foo> >ですか? std::map は入力イテレータから構築できるようです。

アップデート

ちなみに、ベクター内の文字列をマップに追加するときは、小文字の形式に変換する必要があります。これは、マップを使用して、ベクター内のソートされたバージョンを取得したいためです。

4

3 に答える 3

6

すべての標準ライブラリ コンテナーは、反復子範囲から構築できます。あなたの場合:

std::map<std::string, Foo> mymap(myvector.begin(), myvector.end());

文字列の小文字バージョンを追加する場合は、変換反復子を介して値を渡す必要があります。残念ながら、これは標準の C++ には含まれていませんが、実装はかなり簡単です。Boost には次のバージョンも含まれます

// Make the pair's key lower-case
std::pair<std::string, Foo> make_lower(std::pair<std::string, Foo> x) {
    std::transform(x.first.begin(), x.first.end(), x.first.begin(), ::tolower);
    return x;
}

std::map<std::string, int> mymap(
    boost::make_transform_iterator(myvector.begin(), make_lower),
    boost::make_transform_iterator(myvector.end(), make_lower));

これは完全な実行中のデモンストレーションです

于 2013-09-03T09:41:47.513 に答える
0
std::map<std::string, Foo> m;
std::vector<std::pair<std::string, Foo> > vec;

std::vector<std::pair<std::string, Foo> >::iterator it = vec.begin();

for(;it!=vec.end();++it)
{
  std::string temp = it->first;

  std::for_each(temp.begin(), temp.end(), 
        [](char& c){ tolower((unsigned char)c);}); 

  m[temp] = it->second;

 }
于 2013-09-03T09:42:02.170 に答える
0

マップ コンストラクターの定義によると、関数テンプレートの引数InputIteratorは、 value_typeオブジェクトを構築できる型の要素を指す入力反復子型でなければなりません(map では、 value_typeは pair< const key_type, mapped_type > のエイリアスです)。

std::vector<std::pair<std::string, Foo> > V;
//Fill the Vector V using make_pair...or other method
//Vector iterator can be used to construct the Map since you get the pair
std::map<std::string, Foo> M(V.begin(),V.end());
于 2013-09-03T10:44:11.600 に答える