C++ std::map<;整数,T*>;比std::vector快<;T*>;?

C++ std::map<;整数,T*>;比std::vector快<;T*>;?,c++,vector,runtime,stdmap,C++,Vector,Runtime,Stdmap,我正在使用std::map进行频繁的查找和一些定位。没有任何删除。因为我知道int用作键的上限(大约1600万),所以我想我可以使用以下方法为运行时交换一些内存: std::vector<T*> mapReplacement; mapReplacement.resize(max_int, nullptr); std::向量映射替换; mapReplacement.resize(max_int,nullptr); 然而,我的运行时变得非常糟糕,即使没有测量调整大小操作。 向量查找和

我正在使用
std::map
进行频繁的查找和一些定位。没有任何删除。因为我知道int用作键的上限(大约1600万),所以我想我可以使用以下方法为运行时交换一些内存:

std::vector<T*> mapReplacement;
mapReplacement.resize(max_int, nullptr);
std::向量映射替换;
mapReplacement.resize(max_int,nullptr);
然而,我的运行时变得非常糟糕,即使没有测量调整大小操作。 向量查找和对已分配空间的“插入”应该是常量,而映射应该有O(log(n))插入和查找。插入的元素数量也有几十万,所以它甚至不是那么稀少。。。我在这里看不到什么

编辑1: 我既不插入向量,也不迭代/搜索向量,只通过索引进行访问。有代表性的用例如下所示:

std::vector<T*> mapReplacement;

struct DataStructure {

    void getInfluenced(int neighbor);

    void doSomeWork(int vertex){
         for (int i : neighbors(vertex)){
            if (influence(vertex, i)){
                if (mapReplacement[i] == nullptr)
                    mapReplacement[i] = new DataStructure();
                mapReplacement[i]->getInfluenced(vertex);
            }
         }
    }
}

int main(){
    mapReplacement.resize(huge_scalar_field.vertex_count);
    for (int i : huge_scalar_field){
         if (isInterestingVertex(i)){
             if (mapReplacement[i] == nullptr)
                  mapReplacement[i] = new DataStructure();
             mapReplacement[i]->doSomeWork(i);
         }
    }
}
std::向量映射替换;
结构数据结构{
无效(int邻居);
void doSomeWork(int顶点){
对于(int i:邻域(顶点)){
if(影响(顶点,i)){
if(mapplacement[i]==nullptr)
mapReplacement[i]=新数据结构();
mapReplacement[i]->GetInfected(顶点);
}
}
}
}
int main(){
mapReplacement.resize(巨大的标量字段、顶点计数);
for(int i:巨大的标量场){
如果(isInterestingVertex(i)){
if(mapplacement[i]==nullptr)
mapReplacement[i]=新数据结构();
地图置换[i]>doSomeWork(i);
}
}
}
基本上,我在一个巨大的标量场上迭代(16777216个顶点)。字段中的一些顶点(矢量/地图中的544008个条目)是“有趣的”,需要“数据结构”来表示它们。 然而,对于每个感兴趣的顶点,该顶点的某些邻域在某种程度上受到它的影响。这些受影响的顶点现在也需要用“数据结构”表示,并且可能也是“有趣的”。 这就是我代码中向量/映射的每一个用法,但是我没有时间测试这是否是我问题的一个最小示例,或者问题是否只是因为与“isInterestingVertex”、“neighbor”、“influence”、“doSomeWork”和“GetInfluded”内容的一些奇怪交互而产生的

编辑2:
该系统的规格是:Kubuntu 17.04 64位内核版本4.10.0-42-generic、g++6.3.0-12ubuntu2、Intel Core I7-4770K、16GB DDR3 RAM(其中大约4GB在运行时使用)、导入和使用的库是Boost和Boost(但问题也发生在纯顺序运行中)。

这看起来是一个有趣的问题。请提供一个突出显示问题的示例。如何/在何处插入向量?是否可以添加有关正在运行的环境的更多信息。O/S、RAM、CPU等。插入到映射中是一个查找O(log(n))和插入O(1){对于一个好的分配器},这可能非常快,而插入向量需要将每个元素移动到插入位置之上,因此如果使用二进制查找,则是O(log(n)),然后使用O(n/2)进行内存移动。对于小集合,矢量往往会赢,但对于大集合,map将赢。您的访问模式是什么?如果您的密钥是随机的,那么您可能会看到缓存不友好的效果。也许整个
映射
适合缓存,而
向量
不适合缓存。