我有一个包含字符串对的向量:
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)
你知道怎么做吗?
答案 0 :(得分: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;
答案 1 :(得分: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]