【发布时间】:2011-11-20 12:07:00
【问题描述】:
更新:
我正在开发一个性能非常关键的程序。我有一个未排序的结构向量。我需要在这个向量中执行许多搜索操作。所以我决定将矢量数据缓存到这样的地图中:
std::map<long, int> myMap;
for (int i = 0; i < myVector.size(); ++i)
{
const Type& theType = myVector[i];
myMap[theType.key] = i;
}
当我搜索地图时,程序其余部分的结果要快得多。然而,剩下的瓶颈是地图本身的创建(在其中插入大约 1,500 个元素平均需要大约 0.8 毫秒)。我需要想办法缩短这个时间。我只是插入一个 long 作为键和一个 int 作为值。我不明白为什么要花这么长时间。
我的另一个想法是创建向量的副本(不能触及原始向量)并以某种方式执行比 std::sort 更快的排序(排序需要太长时间)。
编辑:
对不起大家。我的意思是说我正在创建一个 std::map ,其中键是长整数,值是整数。 long 值是 struct 的键值,int 是向量中对应元素的索引。
另外,我做了一些调试,发现向量根本没有排序。这是完全随机的。所以做类似 stable_sort 的事情是行不通的。
另一个更新:
感谢大家的回复。我最终创建了一个对向量(std::vector of std::pair(long, int))。然后我按长值对向量进行排序。我创建了一个自定义比较器,它只查看了该对的第一部分。然后我使用 lower_bound 来搜索这对。以下是我的全部做法:
typedef std::pair<long,int> Key2VectorIndexPairT;
typedef std::vector<Key2VectorIndexPairT> Key2VectorIndexPairVectorT;
bool Key2VectorIndexPairComparator(const Key2VectorIndexPairT& pair1, const Key2VectorIndexPairT& pair2)
{
return pair1.first < pair2.first;
}
...
Key2VectorIndexPairVectorT sortedVector;
sortedVector.reserve(originalVector.capacity());
// Assume "original" vector contains unsorted elements.
for (int i = 0; i < originalVector.size(); ++i)
{
const TheStruct& theStruct = originalVector[i];
sortedVector.insert(Key2VectorIndexPairT(theStruct.key, i));
}
std::sort(sortedVector.begin(), sortedVector.end(), Key2VectorIndexPairComparator);
...
const long keyToSearchFor = 20;
const Key2VectorIndexPairVectorT::const_iterator cItorKey2VectorIndexPairVector = std::lower_bound(sortedVector.begin(), sortedVector.end(), Key2VectorIndexPairT(keyToSearchFor, 0 /* Provide dummy index value for search */), Key2VectorIndexPairComparator);
if (cItorKey2VectorIndexPairVector->first == keyToSearchFor)
{
const int vectorIndex = cItorKey2VectorIndexPairVector->second;
const TheStruct& theStruct = originalVector[vectorIndex];
// Now do whatever you want...
}
else
{
// Could not find element...
}
这为我带来了适度的性能提升。之前我的计算总时间为 3.75 毫秒,现在已降至 2.5 毫秒。
【问题讨论】:
-
你没说
Type是什么。也许它有一个昂贵的复制构造函数? -
抱歉,“Type”是一个包含大约 10 个 double 值和一个 long 值(键)的结构。我什至没有将类型复制到地图中。向量中只有键和对应的索引。
-
或更有可能有 1500 多次新的调用。
-
faster sort than the std::find。您的意思是比std::sort更快吗? -
代码不正确。 std::map 需要两个模板参数(键和值)。