1

非常に簡単な質問があります。私は単に愚かなことをしていると思いますが、何時間もバグを見つけることができません。

#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" ;
    }
}

http://ideone.com/HOnvIが機能し、   http: //ideone.com/R6H0nが機能しないのはなぜですか。

コードは、昇順と降順の並べ替えのみが異なります。マップなしでの並べ替え(ベクトルを直接並べ替える)もテストしましたが、そこでは正常に機能します。

4

1 に答える 1

5

この線

vector< pair<uint, T>  > tmp (src.size());

src.size()デフォルトの要素 (ここでは、pair(0, 0.0)) で満たされたサイズのベクトルを作成します。

は、その.push_back()配列の最後に追加の要素を追加します (現在のサイズは (2* src.size())

次に、並べ替えの後、最初のsrc.size()要素のみを出力します。これはすべて最初の 0,0.0 のものです

修正するには、ベクターを空に宣言するだけです。

vector< pair<uint, T>  > tmp;
于 2012-05-01T17:56:41.440 に答える