C++ 常量映射的调用大小()<;字符串,向量<;int>&燃气轮机;引起错误 void示例(const map&num); int main() { mapnum; num[“A”]。向后推(1); 示例(num); 返回0; } 无效示例(常量映射和数值) { cout

C++ 常量映射的调用大小()<;字符串,向量<;int>&燃气轮机;引起错误 void示例(const map&num); int main() { mapnum; num[“A”]。向后推(1); 示例(num); 返回0; } 无效示例(常量映射和数值) { cout,c++,map,C++,Map,问题不是调用size()。问题是在const映射上使用操作符[]():如果键不存在,下标操作符将插入键,从而修改映射。要这样做,std::map当然不能是const 如果您只想访问这些值,则需要直接使用find(): void example(const map<string, vector<int> > & num); int main() { map<string, vector<int> >num;

问题不是调用
size()
。问题是在
const
映射上使用
操作符[]()
:如果键不存在,下标操作符将插入键,从而修改映射。要这样做,
std::map
当然不能是
const

如果您只想访问这些值,则需要直接使用
find()

  void example(const map<string, vector<int> > & num);

  int main()
  {
      map<string, vector<int> >num;

      num["A"].push_back(1);
      example(num);

      return 0;
  }

  void example(const map<string, vector<int> > & num)
  {
      cout <<  num["A"].size() << endl;
  }

函数
num
不知道另一个函数中已经添加了键
“a”
,如果没有键,
num[“a”]
将添加它。因此,要使用
[]
,映射操作数不能是
常量


简而言之,这不是size()的错。

其他人指出了问题所在

void example(std::map<std::string, std::vector<int>> const& num) {
    std::cout << num["A"].size() << '\n';
}
void示例(常量映射和数值)
{

cout问题在于没有为std::map类型的const对象定义运算符[]

  void example(const map<string, vector<int> > & num)
  {
      cout <<  num.at("A").size() << endl;
  }
正如您看到的,参数列表右括号后的限定符const不存在。但是,为const对象定义了处的成员函数(请参见第二个声明)


因此,您必须在处使用成员函数,而不是下标运算符。

这是因为
num[“A”]
std::map
上是一个非常量操作。在C++11中有一个替代方法:@bamboon:哦,感谢上帝!而且,很明显,你以前告诉过我这件事……是的,这很可怕。为什么它会变慢?因为这个函数执行范围检查。请参阅
std::map::operator[]
还需要一些更多的逻辑和检查,因为它可能需要构造元素。@怀疑朱尔:恐怕你不明白
at
在地图上是如何工作的。地图上没有范围检查的概念:因为这是一种通过键访问
[]
at
必须搜索钥匙,并根据钥匙的存在或不存在来决定做什么。因此,钥匙存在时,速度不太可能变慢。在钥匙不存在的情况下,他们两人做的事情非常不同,哪一个更慢无关紧要。
  void example(const map<string, vector<int> > & num)
  {
      cout <<  num.at("A").size() << endl;
  }
T& operator[](const key_type& x);
T& operator[](key_type&& x);
T& at(const key_type& x);
const T& at(const key_type& x) const;.