Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不是';删除std::map线性时间中的对象?或者:在std::map中删除对象的最快方法是什么?_C++_Stdmap_C++98 - Fatal编程技术网

C++ 为什么不是';删除std::map线性时间中的对象?或者:在std::map中删除对象的最快方法是什么?

C++ 为什么不是';删除std::map线性时间中的对象?或者:在std::map中删除对象的最快方法是什么?,c++,stdmap,c++98,C++,Stdmap,C++98,编辑:永远不要对调试版本进行评测。。。一旦我切换到释放,就不会有明显的延迟,而且时间是线性的。创建和删除1000000个对象的时间总共为370毫秒 -- 我有一个包含指向对象指针的映射:std::map myMap 当我删除地图时,我注意到地图越大,似乎需要的时间就越长,而且是指数级的。我期待着线性行为 虽然在地图上干迭代(实际上什么都不做)的行为或多或少是线性的,但删除对象(不修改地图!!)会彻底失败。有人对这种行为有什么解释吗?更重要的是:我能做些什么来加快速度?因为不幸的是,我确实有一个6

编辑:永远不要对调试版本进行评测。。。一旦我切换到释放,就不会有明显的延迟,而且时间是线性的。创建和删除1000000个对象的时间总共为370毫秒

--

我有一个包含指向对象指针的映射:
std::map myMap
当我删除地图时,我注意到地图越大,似乎需要的时间就越长,而且是指数级的。我期待着线性行为

虽然在地图上干迭代(实际上什么都不做)的行为或多或少是线性的,但删除对象(不修改地图!!)会彻底失败。有人对这种行为有什么解释吗?更重要的是:我能做些什么来加快速度?因为不幸的是,我确实有一个60000多个对象的案例,清理我的地图花费了太长时间

代码如下:

class DummyObject
{
public:
     DummyObject() {}
    ~DummyObject() {}
};

void testSpeed( int iMapSize )
{
    const unsigned int uiStart = GetTickCount();

    typedef std::map<int, DummyObject *> T_MyMap;
    T_MyMap myMap;

    // Fill the map...
    for( int i = 0; i < iMapSize; i++ ) {
        myMap[i] = new DummyObject();
    }
    const unsigned int uiFilled = GetTickCount();

    // Dry iteration through the map...
    for( T_MyMap::const_iterator it = myMap.begin(); it != myMap.end(); it++ ) {
        int i = 0;  // do something
    }
    const unsigned int uiIterate = GetTickCount();

    // Delete the map...
    for( T_MyMap::const_iterator it = myMap.begin(); it != myMap.end(); it++ ) {
        delete it->second;
    }
    const unsigned int uiDeleted = GetTickCount();

    myMap.clear();
    const unsigned int uiCleared = GetTickCount();

    DebugText( arg( "MapSize: %1 --- ",   iMapSize )
             + arg( "filled:  %1 msecs; ", uiFilled  - uiStart )
             + arg( "iterate: %1 msecs; ", uiIterate - uiFilled )
             + arg( "deleted: %1 msecs; ", uiDeleted - uiIterate )
             + arg( "cleared: %1 msecs; ", uiCleared - uiDeleted )
             + arg( "total:   %1 msecs; ", uiCleared - uiStart ) );
}
。。。这是我得到的输出:

MapSize:     100 --- filled:      0 msecs; iterate:    0 msecs; deleted:     16 msecs; cleared:    0 msecs; total:       16 msecs;
MapSize:    1000 --- filled:     31 msecs; iterate:    0 msecs; deleted:     15 msecs; cleared:    0 msecs; total:       46 msecs;
MapSize:   10000 --- filled:    203 msecs; iterate:   16 msecs; deleted:     47 msecs; cleared:   15 msecs; total:      281 msecs;
MapSize:  100000 --- filled:   2527 msecs; iterate:  250 msecs; deleted:   1435 msecs; cleared:  234 msecs; total:     4446 msecs;
MapSize: 1000000 --- filled:  34055 msecs; iterate: 2652 msecs; deleted: 172241 msecs; cleared: 1981 msecs; total:   210929 msecs;

我宁愿责怪分配者也不愿责怪地图。用一个普通的c数组你会得到什么结果?我认为计算是错的
+arg(“删除:%1毫秒;”,uiDeleted-uiFilled)
应该是
+arg(“删除:%1毫秒;”,uiDeleted-uiIterate)
我完全同意Adrian上面的评论。而且,它似乎非常依赖于实现:根据我在XCode 6中的测试,我得到了所有分析操作的或多或少的线性结果。(我不会将实际数据作为注释发布,因为格式化很麻烦)无法在win8上复制gcc 4.9.1(总时间),您确定要启用优化吗?Mac OS上的Clang 3.5提供
MapSize:1000000---filled:431毫秒;迭代:29毫秒;删除:178毫秒;清除:259毫秒;总计:868毫秒
。即使禁用了优化,也只需要2-3倍的时间。这是在一台可怜的3年前的1.6GHz笔记本电脑上。
MapSize:     100 --- filled:      0 msecs; iterate:    0 msecs; deleted:     16 msecs; cleared:    0 msecs; total:       16 msecs;
MapSize:    1000 --- filled:     31 msecs; iterate:    0 msecs; deleted:     15 msecs; cleared:    0 msecs; total:       46 msecs;
MapSize:   10000 --- filled:    203 msecs; iterate:   16 msecs; deleted:     47 msecs; cleared:   15 msecs; total:      281 msecs;
MapSize:  100000 --- filled:   2527 msecs; iterate:  250 msecs; deleted:   1435 msecs; cleared:  234 msecs; total:     4446 msecs;
MapSize: 1000000 --- filled:  34055 msecs; iterate: 2652 msecs; deleted: 172241 msecs; cleared: 1981 msecs; total:   210929 msecs;