c++ - 在 C++ std::multimap 上调用 .clear() 或 .erase() 有时会导致卡住(100% cpu)

标签 c++ multimap erase

我们使用多重映射来快速查找值/索引,声明如下

typedef double Numerical;
std::multimap<Numerical, Int32> SortableRowIndex;

然后我们用对填充它,使用

SortableRowIndex.insert(std::pair<Numerical, Int32>(GetSortable(i), i));

函数 GetSortable() 总是返回一个 double 值。这很好用。遍历这些值也可以正常工作。但奇怪的部分来了……有时当我们试图清除数据时……

SortableRowIndex.clear();

...它进入某种循环并停止/竞争,以 100% 占用 CPU 的已用内核。

clear方法好像是继承自xtree(系统文件),里面只有几行:

    void clear() _NOEXCEPT
        {   // erase all
 #if _ITERATOR_DEBUG_LEVEL == 2
        this->_Orphan_ptr(*this, 0);
 #endif /* _ITERATOR_DEBUG_LEVEL == 2 */

        _Erase(_Root());
        _Root() = this->_Myhead;
        _Lmost() = this->_Myhead;
        _Rmost() = this->_Myhead;
        this->_Mysize = 0;
        }

出于某种原因,我的 Visual Studio 2013 不允许我在调试时进入此方法...我不能,我终究无法找出问题所在!

任何帮助将不胜感激!

最佳答案

事实证明,它并没有真正停滞,但通过 Visual Studio 的调试器清除多重映射真的很慢。我注意到内存正在慢慢释放,让它运行几分钟,然后终于完成了。在 Visual Studio 之外运行应用程序使 .clear() 调用下降到 < 1s,即使是数百万对也是如此。

因此,如果您在 visual studio 中以 Debug模式运行时要清除巨大的多重映射,请注意。太慢了。

关于c++ - 在 C++ std::multimap 上调用 .clear() 或 .erase() 有时会导致卡住(100% cpu),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33781959/

相关文章:

c++ - 将 unique_ptr<Derived<T>> 传递给函数

c++ - equal_range C++ 元素顺序

c++ - 使用 erase(begin()) 的 unordered_set 中的 "remove one element"在 gcc 中很慢

c++ - 如何删除和删除指向存储在 vector 中的对象的指针?

c++ - 模板类复制内部类问题中的模板赋值运算符

c++ - 为什么 C++ 不使结构更紧密?

C++ 从 map 的第二个元素迭代

c++ - vector 保存类对象,类对象每个对象包含 3 个字符串。如何找到特定字符串,然后删除整个元素?

c++ - 在 OpenCV/C++ 中使用 KalmanFilter 跟踪多个移动物体 - 如何将轨迹单独分配给检测到的物体

java - 并发多重映射放置和删除