在c ++ std :: multimap上调用.clear()或.erase()有时会导致冻结(100%cpu)

时间:2015-11-18 13:57:23

标签: c++ clear multimap erase

我们使用multimap进行快速值/索引查找,声明如下

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在调试时不会让我介入这个方法......我无法解决问题的原因!

任何帮助都会受到极大的赞赏!

1 个答案:

答案 0 :(得分:3)

事实证明,它并没有真正停滞,但是通过Visual Studio的调试器清除多图是非常慢的。我注意到记忆已经缓慢释放并让它运行了几分钟然后它终于完成了。在Visual Studio外部运行应用程序使.clear()调用下拉到&lt; 1s,即使是数百万对。

因此,如果您在Visual Studio中以调试模式运行时清除巨大的多重映射,请站起来。这是懒散的。