Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 索引的排序向量_C++_Sorting_Vector - Fatal编程技术网

C++ 索引的排序向量

C++ 索引的排序向量,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,

我有一个非常简单的问题,我想我只是在做一些愚蠢的事情,但几个小时都找不到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, 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的约束。