还有一些关于根据另一个向量B中的值对向量A进行排序的帖子。大多数其他答案告诉创建一个结构或类来将值组合到一个对象中并使用std :: sort。
虽然我对这些解决方案的性能感到好奇,因为我需要优化实现冒泡排序的代码来对这两个向量进行排序。我正在考虑使用vector<pair<int,int>>
并对其进行排序。
我正在开发一个blob跟踪应用程序(图像分析),我尝试将先前跟踪的blob与视频帧中新检测到的blob进行匹配,其中我针对几个先前跟踪的帧检查每个帧,当然还有我在之前的帧中发现了斑点。我这样做的速度是每秒60次(我的网络摄像头的速度)。
有关优化此建议的任何建议表示赞赏。我想要优化的代码可以在这里显示:
重要:我忘了提到矢量的大小永远不会大于5,并且大部分只有3个项目并且将是未分类的(也许我甚至可以对3个项目进行硬编码?)< /强>
由于
答案 0 :(得分:3)
C ++提供了许多排序选项,从std::sort
算法到排序容器,如std::map
和std::set
。你应该总是尝试使用这些作为你的第一个解决方案,并且只尝试“优化的泡沫排序”之类的东西作为最后的手段。
答案 1 :(得分:1)
我刚才实现了这个。另外,我认为你的意思是按照与之相同的方式排序矢量B. 已排序的值。
Index
包含data
的排序顺序。
/** Sorts a vector and returns index of the sorted values
* \param Index Contains the index of sorted values in the original vector
* \param data The vector to be sorted
*/
template<class T>
void paired_sort(vector<unsigned int> & Index, const vector<T> & data)
{
// A vector of a pair which will contain the sorted value and its index in the original array
vector<pair<T,unsigned int>> IndexedPair;
IndexedPair.resize(data.size());
for(unsigned int i=0;i<IndexedPair.size();++i)
{
IndexedPair[i].first = data[i];
IndexedPair[i].second = i;
}
sort(IndexedPair.begin(),IndexedPair.end());
Index.resize(data.size());
for(size_t i = 0; i < Index.size(); ++i) Index[i] = IndexedPair[i].second;
}