问题描述
我正在尝试在公共成员函数中迭代 multimap,它是我的类的私有成员,以便我可以遍历 multimap 并打印元素。我知道如果我将打印函数设置为非 const 它可以工作,但我无法完全理解为什么它不能与 const 一起工作。我假设分配迭代器 (my_map.begin()) 允许修改多重映射,但 const 修饰符不允许这样做,因此,代码将无法编译。谁能给我一个清晰和更深入的解释至于为什么这不适用于 const 函数?我对使用 STL 容器还很陌生,只是想更深入地了解它们的功能。感谢所有帮助。 (C++ 代码如下) (PS:为了尽可能清楚,我不是在问如何遍历多图。再次感谢。)
#include <iostream>
#include <iterator>
#include <string>
#include <map>
// Synonymous types for my multimap and multimap iterator
typedef std::multimap<int,std::string> mm;
typedef mm::iterator mit;
class Foo
{
private:
mm my_map;
static int count;
public:
Foo() {}
void add(const std::string&);
void print() const;
};
int Foo::count = 0;
void Foo::add(const std::string& s)
{
my_map.insert(std::make_pair(count++,s));
}
**// This is the implementation of the that breaks my code**
void Foo::print() const
{
mit it = my_map.begin(); // **I do not fully understand why this does not work.**
}
解决方法
如果您想在 const 函数中获取迭代器,则不能使用 iterator,而必须使用 const_iterator。所以你必须改变 mit 类型:
typedef mm::const_iterator mit;
这里正在编译和运行: https://godbolt.org/z/jM4rK6556
或者另一种方法是不强制类型并让它推断它想要的任何东西,通过改变打印内的行:
auto it = my_map.begin();
这是它的运行版本: https://godbolt.org/z/rTv6xqPqq
对于未来,最好将您遇到的错误包含在问题中,以便其他人知道并且更容易谷歌搜索。甚至阅读错误也暗示了正在发生的事情:
<source>: In member function 'const void Foo::print() const':
<source>:31:24: error: conversion from 'std::multimap<int,std::__cxx11::basic_string<char> >::const_iterator' {aka 'std::_Rb_tree<int,std::pair<const int,std::__cxx11::basic_string<char> >,std::_Select1st<std::pair<const int,std::__cxx11::basic_string<char> > >,std::less<int>,std::allocator<std::pair<const int,std::__cxx11::basic_string<char> > > >::const_iterator'} to non-scalar type 'mit' {aka 'std::_Rb_tree<int,std::__cxx11::basic_string<char> > > >::iterator'} requested
31 | mit it = my_map.begin();
| ~~~~~~~~~~~~^
所以说比较类型的时候不能从A型转换成B型,区别很明显,这里是A型:
std::multimap<int,std::__cxx11::basic_string<char> >::const_iterator
所以您的 mit 类型与 my_map.begin() 返回的内容不匹配。