map operator []操作数

Jam*_*ook 13 c++ map operands

大家好,我在成员函数中有以下内容

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

以及成员变量的以下声明

map<int, vector<set<int>>> m_egressCandidatesByDestAndOtMode;
Run Code Online (Sandbox Code Playgroud)

但编译时遇到错误(英特尔编译器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>                                                                    ^
Run Code Online (Sandbox Code Playgroud)

我知道它必须是愚蠢的,但我看不出我做错了什么.

UPDATE我从const成员函数调用它,这就是为什么成员变量的类型是const所以我认为类似下面的内容应该修复它:

int dest = 0, tt = 6; 
const set<int>& egressCandidateStops = m_egressCandidatesByDestAndOtMode[tt].at(dest); 
Run Code Online (Sandbox Code Playgroud)

但没有骰子......仍然是同样的错误.

Pot*_*ter 24

操作数类型是:const std :: map <int ...

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

我几天前回答了这个问题.

map :: operator []有点奇怪.它这样做:

  1. 寻找钥匙.
  2. 如果找到,请将其退回.
  3. 如果没有,请插入它并默认构造其关联值.
  4. 然后返回对新值的引用.

第3步与constness不兼容.语言强制您使用map :: find作为const对象,而不是使用两个功能不同的operator []重载.


And*_*nck 6

原型[]

 data_type& operator[](const key_type& k)
Run Code Online (Sandbox Code Playgroud)

即一个非const操作,所以你不能在const成员函数的成员上调用它.

您可以将代码更改为:

std::map<...>::const_iterator where = m_egressCandidatesByDestAndOtMode.find(tt);
if (egressCandidatesByDestAndOtMode.end() != where) {
    const vector<set<int>>& temp = where->second;
}
Run Code Online (Sandbox Code Playgroud)