C++ C++;11:std::无序地图<;int,std::stack<;int>&燃气轮机;从映射中获取值而无需多次复制

C++ C++;11:std::无序地图<;int,std::stack<;int>&燃气轮机;从映射中获取值而无需多次复制,c++,c++11,vector,stack,unordered-map,C++,C++11,Vector,Stack,Unordered Map,我有一个全局变量: std::unordered_map<int, std::stack<int>> intTable; 然后,我有时需要将其添加到堆栈中,并检查其顶部值,因此,如果它大于某个值,我需要将其弹出并从映射中删除该键: intTable[integerKey].push(20); if (intTable[integerKey].top() >= someIntegerValue) { intTable[inte

我有一个全局变量:

std::unordered_map<int, std::stack<int>> intTable;
然后,我有时需要将其添加到堆栈中,并检查其顶部值,因此,如果它大于某个值,我需要将其弹出并从映射中删除该键:

    intTable[integerKey].push(20);

    if (intTable[integerKey].top() >= someIntegerValue)
    {
       intTable[integerKey].pop();

       if (intTable[integerKey]->size() == 0)
       {
          intTable.erase(integerKey);
       }
    }
我的问题是有更好的方法吗?例如,我看到的一个低效之处是我多次在地图中建立索引。有可能避免吗?如何存储对intTable[integerKey]的引用而不复制它?

您可以这样做

std::stack<int> &localReference = intTable[integerKey];
std::stack&localReference=intTable[integerKey];

尽管编译器很可能会在本地函数的范围内优化intTable[integerKey],所以它在实际汇编代码中可能没有差异。

在访问映射成员时,映射成员会使用默认构造函数初始化

std::stack<int> &localReference = intTable[integerKey];
std::stack&localReference=intTable[integerKey];

将分配堆栈(如果它不存在),并返回对堆栈的引用。

按键无序映射访问非常快。您可以引用元素并处理该元素,但如果不这样做,则可以。

此外,如果您想再次删除w/o搜索,请使用
find
将迭代器获取到映射中。我不知道我可以通过迭代器删除键!如果我有迭代器,我可以用它从映射中检索值吗?我现在总是这样。查找()。。然后,如果它存在,我通过执行mymap[key]…@user986697来检索该密钥。可以,请参见
std::stack<int> &localReference = intTable[integerKey];
std::stack<int> &localReference = intTable[integerKey];