出于测试目的,我通过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 &);
};
由于
答案 0 :(得分:2)
您的map
属于
map<int, vector<Vertex>>
这意味着first
为int
,second
为vector<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;
}