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

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

出于测试目的,我通过 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代码:

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

显示 Vertex 因为你用第二个参数声明了 operator << 作为非常量引用

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限定符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;
}