3

文字列のペアを含むベクトルがあります。

vector<pair<string, string>> list;

list[n].second同じ文字列をグループ化したいlist[n].first

const size_t nbElements = list.size();
for (size_t n = 0; n < nbElements ; n++)
{
    const string& name = list[n].first;
    const string& type = list[n].second;
}

次の例を検討してください。

(big; table) (normal; chair) (small; computer) (big; door) (small; mouse)

結果は次のようになります。

(big; table, door) (normal; chair) (small; computer, mouse)

それを行う方法はありますか?

4

2 に答える 2

5

あなたは使用することができますstd::map


例:

#include <boost/algorithm/string/join.hpp>
#include <boost/format.hpp>

#include <iostream>
#include <map>
#include <vector>

int main() {
    // define original data
    std::vector<std::pair<std::string, std::string> > v = 
            {{"a", "b"}, {"a", "c"}, {"b", "a"}, {"b", "d"}, {"c", "e"}};

    // populate map
    std::map<std::string, std::vector<std::string> > grouped;
    for (auto it = v.begin(); it != v.end(); ++it) {
        grouped[(*it).first].push_back((*it).second);
    }

    // output        
    for (auto it = grouped.begin(); it != grouped.end(); ++it) {
        std::cout << boost::format("(%s: %s)\n")
                % (*it).first 
                % boost::algorithm::join((*it).second, ", ");
    }
}

出力は次のとおりです。

(a: b, c)
(b: a, d)
(c: e)

このコードは C++11 の機能 (初期化リスト、auto キーワード) を利用していることに注意してください。コンパイルの成功については、上記のリンクされた例をご覧ください。

これを自分でコンパイルするには、使用するコンパイラがこれらの機能をサポートしていることを確認するか、適切な C++03 の同等のものに置き換えてください。

たとえば、イテレータの型は次のautoとおりです (上記のコードでキーワードを使用して美化されています)。

// the iterator on the vector `v`
std::vector<std::pair<std::string, std::string> >::iterator it_v;

// the iterator on the map `grouped`
std::map<std::string, std::vector<std::string> >::iterator it_grouped;
于 2013-01-08T15:39:36.647 に答える
4

マルチマップが必要になる場合があります。

std::multimap<std::string, std::string> items;
items.insert("Big", "Chair");
items.insert("Big", "Table");
items.insert("Small", "Person");


for(auto i = items.begin(); i!=items.end; i++)
{
  std::cout<<"["<<i->first<<" , "<<i->second<<"]"<<std::endl;
}

出力:

[Big, Chair]
[Big, Table]
[Small, Person]
于 2013-01-08T15:40:02.657 に答える