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;.