如何读取<string,vector<pair<int, string>>>类型的map?
问题分析与解决
你遇到的问题很明确——你把vector当成了pair来访问成员了!
先回顾一下你的类型定义:
typedef vector< pair<int, string> > Categories; map<string,Categories> cats;
这里cats的value类型是Categories,也就是vector<pair<int, string>>,是一个容器,里面装着多个pair对象。而你在遍历的时候写了it->second.first,但vector根本没有first这个成员,只有pair才有,编译器自然会报错。
解决方法分两种情况:
情况1:你想遍历每个分类下的所有pair元素
那需要再加一层循环,遍历it->second这个vector:
for(map<string,Categories>::const_iterator it = cats.begin(); it != cats.end(); ++it) { std::cout << it->first << ": "; // 遍历vector里的每个pair for(const auto& p : it->second) { std::cout << "(" << p.first << ", " << p.second << ") "; } std::cout << "\n"; }
如果是C++11之前的版本,内层循环可以用vector的迭代器:
for(vector<pair<int, string>>::const_iterator vec_it = it->second.begin(); vec_it != it->second.end(); ++vec_it) { std::cout << "(" << vec_it->first << ", " << vec_it->second << ") "; }
情况2:你只是想取每个分类下的第一个pair元素
那你需要先拿到vector里的第一个元素,再访问它的first:
for(map<string,Categories>::const_iterator it = cats.begin(); it != cats.end(); ++it) { // 先判断vector是否为空,避免越界 if(!it->second.empty()) { std::cout << it->first << " " << it->second.front().first << "\n"; // 或者用it->second[0].first,效果一样,但front()更符合容器的语义 } }
记住,it->second是一个vector,必须先定位到里面的某个pair元素,才能访问first和second成员哦!
内容的提问来源于stack exchange,提问作者Just_Newbie
相关产品推荐
相关产品推荐

