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

STL Map - Displaying what is pointed to by find() function

本文关键字:函数 Map 显示 find STL      更新时间:2023-10-16

出于测试目的,我通过for循环运行以下代码。实际上只有前三个键存在,并且按照预期显示"Record found"以及从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 &);
};

谢谢

您的map类型为

map<int, vector<Vertex>>

这意味着firstint, secondvector<Vertex>

虽然您已经为Vertex定义了operator<<,但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';
     }
 }

首先你不能使用const_iterator

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

显示顶点,因为你用第二个参数声明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;

如果要修改为第二个形参指定限定符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;
}