你可以使用一个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;