【问题标题】:Is it safe to insert into an unordered_multimap while iterating over elements with the same key?在迭代具有相同键的元素时插入 unordered_multimap 是否安全?
【发布时间】:2018-05-26 00:34:36
【问题描述】:

我在不同平台和不同编译器(clang 和 g++)上使用此代码时遇到了不同的行为。对于 Linux 上的 g++,这段代码似乎没有问题。内部循环在两次迭代后留下。但是在 Mac OS 上使用 clang 时,内部循环似乎找不到 range.second 并且代码不会终止。

由于在迭代期间插入了 std::unordered_multimap,我的问题是这是否会导致不良行为。

typedef pair< vector<int>, vector<int> > VPair;
typedef pair< vector<int>, VPair > V_VPair;
typedef unordered_multimap < vector<int>, VPair, VHash > V2VPairMap;

V2VPairMap v2vPairs;
//... fill v2vPairs
for(vector<int> myVector : vectorOfIntVectors) {
    //search this int vector in unordered map
    auto range = v2vPairs.equal_range(myVector);
    for (auto it = range.first; it != range.second; ++it)
    {
        pair< vector<int>, vector<int> > aPair = it->second;
        //...
        V_VPair newPair1(newVector1, aPair);
        V_VPair newPair2(newVector2, aPair);
        v2vPairs.insert(newPair1); // <----- safe?
        v2vPairs.insert(newPair2); // <----- safe?
    }
    v2vPairs.erase(myVector); // <-- should be safe
}

【问题讨论】:

    标签: c++11 g++ clang


    【解决方案1】:

    来自std::unordered_multimap::insert

    如果由于插入而发生重新散列,则所有迭代器都将失效。否则迭代器不受影响。引用不会失效。

    换句话说,该插入可能会使您现有的迭代器无效并导致未定义的行为。

    【讨论】:

    • 我应该在循环之后插入,可能。为什么这种情况发生在clang而不是g ++中是否有原因?还是纯属巧合?
    • @Sadik 哈希表的不同实现,因此它们可能在不同时间重新哈希。
    猜你喜欢
    • 2023-01-14
    • 2011-10-10
    • 2012-02-21
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2015-04-03
    • 1970-01-01
    相关资源
    最近更新 更多