如何阅读<string,vector <pair <int,string =“”>&gt;&gt;的地图

时间:2018-05-13 18:54:10

标签: c++ c++11 stdvector stdmap std-pair

我有这样的地图

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";

4 个答案:

答案 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

然后你将如何打印矢量元素?选项包括:

  1. 随机访问(即std::vector< std::pair<int, std::string>>
  2. iterator(即vec[index]
  3. 或基于循环的范围(即std::vector< std::pair<int, std::string>>::const_iterator itr;
  4. 在你的情况下,如果你想要一些简单易用的代码使用基于范围的循环:

    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";
        }
    }