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 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);
显示顶点,因为你用第二个参数声明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;
}
相关文章:
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- 如何创建一个模板化函数,可以在任何具有字符串键的 std::map 上运行?
- 在C++中实现类似 python "map"函数的问题:调用类成员函数
- 通过构造函数插入 std::map
- 如何将不同的函数签名映射到同一个 std::map?
- 如何在 Visual C++ 中从返回类型为 map 的函数返回 null?
- 为什么 STL 函数使用节点的颜色来计算 std::map 节点前身
- 为什么std::map有find成员函数
- 在构造函数初始值设定项中使用 Map 的初始值设定项列表
- 尝试在 std::map 中插入抽象类时没有用于调用的匹配函数
- 有没有类似的函数,比如 c++ 中的 JS Array.prototype.map?
- 在 std::map 中插入对象时构造函数中变量的地址
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 为什么我可以将 std::map 的键传递给一个期望非常量的函数?
- 正确的友元定义,以授予 std::map 对私有默认构造函数的访问权限
- 如何在搜索中不使用std::map的自定义比较函数(map::find)