std :: map <int,t *>如何比std :: vector <t *>更快?

时间:2017-12-14 12:14:17

标签: c++ vector runtime stdmap

我使用std::map<int, T*>进行频繁的查找和一些安置。永远不会有任何删除。由于我知道用作键的int的上限(大约是1600万),我想我可以使用以下内容为运行时交换一些内存:

std::vector<T*> mapReplacement;
mapReplacement.resize(max_int, nullptr);

然而,即使不测量调整大小操作,我的运行时也会变得更糟。 矢量查找和&#34;插入&#34;已经分配的空间应该是常量,而映射应该有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);
         }
    }
}

基本上我在一个巨大的标量场(16777216个顶点)上进行迭代。该字段中的一些顶点(矢量/映射中的544008个条目)是#34;有趣的&#34;并需要一个&#34; DataStructure&#34;代表他们。 然而,每个有趣的顶点,该顶点的某个邻域以某种方式受其影响。那些受影响的顶点现在也需要由一个&#34; DataStructure&#34;并且可能也很有趣&#34;。 这是关于我的代码中矢量/地图的每次使用,但是我没有时间测试这是否是我的问题的最小例子,或者是否因为与...的一些奇怪的交互而出现问题内容&#34; isInterestingVertex&#34;,&#34;邻居&#34;,&#34;影响&#34;,&#34; doSomeWork&#34;和&#34; getInfluenced&#34;。

EDIT2: 该系统的规格为:Kubuntu 17.04 64位内核版本4.10.0-42-通用,g ++ 6.3.0-12ubuntu2,Intel Core I7-4770K,16GB DDR3 RAM(运行时使用约4GB),导入和使用库是Boost和HPX(但问题也出现在纯粹的顺序运行中)。

0 个答案:

没有答案