映射运算符[]的操作数

15

大家好,我在一个成员函数中有以下代码

int tt = 6; 
vector<set<int>>& temp = m_egressCandidatesByDestAndOtMode[tt]; 
set<int>& egressCandidateStops = temp.at(dest);

以及一个成员变量的声明如下:

map<int, vector<set<int>>> m_egressCandidatesByDestAndOtMode;

然而,在编译时我遇到了一个错误(使用Intel编译器11.0)

1>C:\projects\svn\bdk\Source\ZenithAssignment\src\Iteration\PtBranchAndBoundIterationOriginRunner.cpp(85): error: no operator "[]" matches these operands
1>            operand types are: const std::map<int, std::vector<std::set<int, std::less<int>, std::allocator<int>>, std::allocator<std::set<int, std::less<int>, std::allocator<int>>>>, std::less<int>, std::allocator<std::pair<const int, std::vector<std::set<int, std::less<int>, std::allocator<int>>, std::allocator<std::set<int, std::less<int>, std::allocator<int>>>>>>> [ const int ]
1>          vector<set<int>>& temp = m_egressCandidatesByDestAndOtMode[tt]; 
1>                                                                    ^
我知道一定是什么愚蠢的小错误,但我看不出我做错了什么。 更新 我正在从一个常量成员函数中调用它,这就是为什么成员变量的类型是const,所以我认为以下代码应该修复它:
int dest = 0, tt = 6; 
const set<int>& egressCandidateStops = m_egressCandidatesByDestAndOtMode[tt].at(dest); 

但是没有结果......仍然是相同的错误。


Potatoswatter的答案是正确的。为了避免你的问题,你需要使用find函数。 - fulmicoton
2个回答

26

操作数类型为:const std::map< int …

map::operator[] 不适用于 const map

我几天前在 Stack Overflow 上回答了这个问题。

map::operator[] 有点奇怪。它会执行以下操作:

  1. 查找键。
  2. 如果找到,则返回该值。
  3. 如果未找到,则插入并构造其关联的默认值。
  4. 然后返回新值的引用。

第3步与 const 不兼容,语言规定 const 对象必须使用 map::find。


就是这样!我会在七分钟内标记为已回答,不知道为什么我现在还不能...如果答案正确,那就是正确的 :) - Jamie Cook
1
现在可能值得提一下 std::map::at - juanchopanza

7
< p >[] 的原型是

 data_type& operator[](const key_type& k)
即非const操作,因此您无法在const成员函数中调用它。 您可以将代码更改为:
std::map<...>::const_iterator where = m_egressCandidatesByDestAndOtMode.find(tt);
if (egressCandidatesByDestAndOtMode.end() != where) {
    const vector<set<int>>& temp = where->second;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接