STL Map - 显示find()函数指向的内容

时间:2015-05-19 16:33:58

标签: c++ dictionary stl iterator iostream

出于测试目的,我通过for循环运行以下代码。实际上只存在前三个键,“找到记录”按预期显示,以及从findVertex->first检索的密钥。

  • 我的问题是,我如何能够访问指向的第二个值?

findVertex->second似乎很明显,但不起作用,因为第二个值是我创建的对象,其声明在代码下面给出,如果它有用的话。

for(int i = 0; i<10; i++)
    {
     map<int, vector<Vertex> >::const_iterator findVertex = vertexMap.find(i);

     if(findVertex != vertexMap.end())
      {
          cout<<"\nRecord found: ";
          cout<<findVertex->first;
          cout<<findVertex->second; //does not work
      }
     else
         cout<<"\nRecord not found";
}

课程代码:

class Vertex
{
    private:
        int currentIndex;
        double xPoint, yPoint, zPoint;
        vector<double> attributes;

    public:
        friend istream& operator>>(istream&, Vertex &);
        friend ostream& operator<<(ostream&, Vertex &);
};

由于

2 个答案:

答案 0 :(得分:2)

您的map属于

类型
map<int, vector<Vertex>>

这意味着firstintsecondvector<Vertex>

虽然您为operator<<定义了Vertex,但vector<Vertex>没有这样的功能。您已遍历vector,如果您有权访问C ++ 11,则可以使用类似

的内容
 if(findVertex != vertexMap.end())
 {
     cout << "\nRecord found: ";
     cout << findVertex->first << '\n';
     for (auto const& vertex : findVertex->second)
     {
         cout << vertex << '\n';
     }
 }

如果您无法访问C ++ 11,则可以手动执行相同的操作

 if(findVertex != vertexMap.end())
 {
     cout << "\nRecord found: ";
     cout << findVertex->first << '\n';
     for (vector<Vertex>::const_iterator itVertex = findVertex->second.cbegin();
          itVertex != findVertex->second.cend();
          ++itVertex)
     {
         Vertex const& vertex = *itVertex;
         cout << vertex << '\n';
     }
 }

答案 1 :(得分:1)

首先,您不能使用const_iterator

map<int, vector<Vertex> >::const_iterator findVertex = vertexMap.find(i);

显示Vertex,因为您使用第二个参数声明operator <<作为非const引用

friend ostream& operator<<(ostream&, Vertex &); 
                                     ^^^^^^^^

你应该声明它像

friend ostream& operator<<(ostream&, const Vertex &);
                                     ^^^^^

否则将上述声明改为以下

map<int, vector<Vertex> >::iterator findVertex = vertexMap.find(i);
                           ^^^^^^^^ 

并更改此声明

cout<<findVertex->second; //does not work

到以下代码段

for ( Vertex &v : findVertex->second ) cout << v << endl;

如果您要修改第二个参数的运算符specyfying qualifier const,那么您可以编写

map<int, vector<Vertex> >::const_iterator findVertex = vertexMap.find(i);
                           ^^^^^^^^^^^^^^
//...

for ( const Vertex &v : findVertex->second ) cout << v << endl;
      ^^^^^

或者代替基于for语句的范围,您可以使用普通循环,例如

for ( std::vector<Vertex>::size_type i = 0; i < findVertex->second.size(); i++ )
{
    std::cout << findVertex->second[i] << std::endl;
}

for ( std::vector<Vertex>::iterator it = findVertex->second.begin(); 
      it != findVertex->second.end(); 
      ++it )
{
    std::cout << *it << std::endl;
}