C++ 索引的排序向量
我有一个非常简单的问题,我想我只是在做一些愚蠢的事情,但几个小时都找不到bugC++ 索引的排序向量,c++,sorting,vector,C++,Sorting,Vector,我有一个非常简单的问题,我想我只是在做一些愚蠢的事情,但几个小时都找不到bug #include <vector> #include <algorithm> #include <iostream> using namespace std; typedef unsigned int uint; enum {ASCEND, DESCEND}; template<typename T> bool ascend_sort(pair<uint,
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
typedef unsigned int uint;
enum {ASCEND, DESCEND};
template<typename T>
bool ascend_sort(pair<uint, T> i, pair<uint, T> j){return j.second>i.second;}
template<typename T>
bool descend_sort(pair<uint, T> i, pair<uint, T> j){return i.second>j.second;}
template<typename T>
void sortIdx(vector<uint>& idx, const vector<T>& src, int dir=ASCEND){
vector< pair<uint, T> > tmp (src.size());
for (uint i=0; i<src.size(); i++){
tmp.push_back(pair<uint, T>(i, src[i]));
cout << i << " " << src[i] << " \n";
}
if (dir==ASCEND){
sort(tmp.begin(), tmp.end(), ascend_sort<T>);
}else{
sort(tmp.begin(), tmp.end(), descend_sort<T>);
}
idx.resize(src.size());
for (uint i=0; i<src.size(); i++){
idx[i] = (tmp[i].first);
cout << tmp[i].first << " \n" ;
}
}
#包括
#包括工作而不是
这些代码只在升序和降序排序上有所不同。我还测试了不带map的排序(直接对向量排序),它在那里工作得很好。行
vector< pair<uint, T> > tmp (src.size());
线路
vector< pair<uint, T> > tmp (src.size());
首先使用大小构造tmp
向量,然后使用push_back
。这不是你想要的。您的比较器是奇数的,并且按值获取参数。通过非常量引用获取参数(如idx
是一种反模式)。用火杀死它。是的,推回是个问题。为什么我的比较器很奇怪?否则,我如何在不复制“index”的情况下传递输出呢?比较器应该通过引用const来获取它们的参数。另外,不要反转参数顺序,而是反转使用的比较。让它更容易阅读。只需按值返回即可。好吧,对不是很大,但ref比这里的值好。我不同意你的第二点,为什么我要按价值返回?这将导致不必要地复制整个向量。在现代编译器上,向量只需移动,而在每个较旧的工业级编译器上,它都受NRVO的约束。您的tmp
向量首先使用大小构造,然后使用push\u
。这不是你想要的。您的比较器是奇数的,并且按值获取参数。通过非常量引用获取参数(如idx
是一种反模式)。用火杀死它。是的,推回是个问题。为什么我的比较器很奇怪?否则,我如何在不复制“index”的情况下传递输出呢?比较器应该通过引用const来获取它们的参数。另外,不要反转参数顺序,而是反转使用的比较。让它更容易阅读。只需按值返回即可。好吧,对不是很大,但ref比这里的值好。我不同意你的第二点,为什么我要按价值返回?这将导致不必要地复制整个向量。在现代编译器上,向量只需移动,而在每一个旧的工业级编译器上,向量都受NRVO的约束。