我有这样的地图
typedef vector< pair<int, string> > Categories;
map<string,Categories> cats;
但是当我试图读取地图的元素时
for(map<string,Categories>::const_iterator it = cats.begin(); it != cats.end(); ++it)
{
std::cout << it->first << " " << it->second.first<<"\n";
}
我确实收到了错误
error: 'const class std::vector<std::pair<int, std::basic_string<char>
' has no member named 'first' std::cout << it->first << " " << it-> second.first<<"\n";
答案 0 :(得分:2)
错误:&#39; const class std :: vector&#39;没有名字&#39; first&#39; std :: cout&lt;&lt;它 - &gt;第一&lt;&lt; &#34; &#34; &LT;&LT; IT-&GT; second.first&LT;&LT;&#34; \ n&#34 ;;
明确表示Crystal,您的地图Div
中可能包含许多元素,即value
然后你将如何打印矢量元素?选项包括:
std::vector< std::pair<int, std::string>>
)vec[index]
)std::vector< std::pair<int, std::string>>::const_iterator itr;
)在你的情况下,如果你想要一些简单易用的代码使用基于范围的循环:
for(const auto& it: vec)
如果你仍然想要长 for(const auto& it: cats)
{
std::cout << it.first << " = "; // keys
for(const auto& ve: it.second) // values vec
std::cout << ve.first << "-" << ve.second << "\t";
std::cout << std::endl;
}
个循环,那就是它。
在此处查看实时操作:https://www.ideone.com/3bS1kR
iterator
答案 1 :(得分:1)
首先需要访问向量的元素,然后才能访问该对中的元素。
... it->second[0].first<<
...
更好的循环:
for(const auto& cat : cats)
{
string mapidx = cat.first;
vector<pair<int, std::string>> catvect = cat.second;
}
然后你可以有一个单独的循环来读取向量的内容:
for(const auto& cat : cats)
{
string mapidx = cat.first;
vector<pair<int, std::string>> catvect = cat.second;
for (const auto& entry : catvect)
{
int number = entry.first;
string whatever = entry.second;
}
}
临时变量只是为了可读性,不需要所有副本;)
答案 2 :(得分:1)
错误是编译器告诉你的错误:
const class std::vector ' has no member named 'first'
所以,你已经决定如何通过重载ostream opeartor来打印你的地图,下面的例子是如何实现的:
#include <iostream>
#include <map>
#include <string>
#include <utility>
#include <vector>
typedef std::vector<std::pair<int, std::string>> Categories;
std::map<std::string,Categories> cats;
std::ostream& operator << (std::ostream& os, const std::vector<std::pair<int, std::string>>& v)
{
os << "[";
for (auto& el : v) {
os << " " << el.first << " : " << el.second;
}
os << "]";
return os;
}
int main() {
cats.emplace("cat1", std::vector<std::pair<int, std::string>>(1, std::make_pair(1, "category1")));
for(auto& cat : cats) {
std::cout << cat.first << " " << cat.second << "\n";
}
}
答案 3 :(得分:0)
由于我们将Vector Categories存储在Map中,我们也必须迭代Vector:
for(map<string,Categories>::const_iterator it = cats.begin(); it != cats.end(); ++it)
{
//iterator for vector (it->second)
for(Categories::const_iterator it2 = it->second.begin(); it2 != it->second.end(); it2++ )
{
std::cout << it->first << " " << it2->first<<" "<<it2->second <<"\n";
}
}