我必须读取一个边缘列表,其中包含100,000个顶点和大约200,000个边缘: 顶点A --->顶点B,成本为X
我有一个带有int键的unordered_map(Vertex A)并将键映射到Edges的向量,其中Edges包含Vertex B和Cost X,如下所示:unordered_map<int, vector<Edge> > adjList
我用来填充我的adjList的方法是
(... read Vertex A, B and Cost X out of file...)
Edge e(Vertex B, Cost X) //create a new Object Edge
adj[Vertex A].push_back(e); //put it into the vector
使用100.000个顶点填充adjList
并且边缘需要很长时间,而我的VS-Performance Profiler告诉我,unordered_map的operator []函数是我的瓶颈。是否有其他方法将我的数据放入unodre_map?甚至是用于此应用程序的其他数据结构?
由于
答案 0 :(得分:0)
以下是您可以按顺序尝试的内容。
确保您正在构建发布配置。默认情况下,VS中的调试版本中的STL集合非常慢。您也可以使用some #defines。
如果您事先知道您期望的元素数量,请在unordered_map上调用reserve
非常小,可能是由编译器优化的,但是,你最好用一个使用vector::emplace_back在该向量内创建一个新Edge的单行替换你的两行。
< / LI>如果这还不够,请转到更好的哈希映射。虽然易于使用,便携和标准,但STL系列并不是特别快。在Windows上我推荐CAtlMap,它要快得多。