vectorの配列番号をメモったまま(部分的に)並び変える
昇順・降順ともに一旦ベクトルの値をindex-valueでペア化して、それをソート(ここではpartial_sort)するような関数(ここではlessPair, greaterPair)を用意すればOK。
ここではベクターの上位二番目の位までを降順並び替え。
#include <vector> #include <algorithm> #include <iostream> //index-valueのペア typedef std::pair<int,int> ipair; bool lessPair(const ipair& l, const ipair& r){return l.second < r.second;} bool greaterPair(const ipair& l, const ipair& r){return l.second > r.second;} int main() { using namespace std; //適当データ vector<int> x; x.push_back(11); x.push_back(7); x.push_back(3); x.push_back(4); x.push_back(8); //インデックスと共にペアに突っ込む std::vector<ipair> y; for(unsigned int i = 0; i < x.size(); i++){ y.push_back(ipair(i, x[i])); } //部分ソート、値の上位2位までは並び替え partial_sort(y.begin(), y.begin()+2, y.end(), greaterPair); //インデックス・値の出力 for(vector<ipair>::iterator it = y.begin(); it != y.end(); ++it){ cout << it->first << " " << it->second << endl; } return 0; }}
実行結果(一列目:元の配列のインデックス、二列目:降順に並びかえられた値)
0 11 4 8 2 3 3 4 1 7