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>>
这意味着 first
是 int
,而 second
是 vector<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;
}
出于测试目的,我通过 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>>
这意味着 first
是 int
,而 second
是 vector<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;
}