- 締切済み
構造体型二次元ベクタのソート
構造体型の二次元のベクタをソートしたいのですがやりかたがよくわかりません。 struct coordinate{ int x; int y; }; vector< vector<coordinate> > dbVec; 上記のコードで、 dbVec[val][0].x のxを昇順にval列をソートしたいです。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- maru_yoshi_
- ベストアンサー率39% (17/43)
#2 >そもそも2次元配列をソートしたいというのはどのような仕様でしょうか? 質問に > dbVec[val][0].x のxを昇順にval列をソートしたいです。 とあるので、各ベクタの先頭要素のxをキーにするということだと思います。 で、#1の >「そ~いう比較関数」を作ってやってください. の指示に従って比較関数を作成すると、下に示すコードのようになります。 > 現実的な問題として, 本当に std::vector 同士を入れ替えたときにどのくらい時間がかかるかは知らんけど. ソートが必要なら、配列の配列にするより配列のポインタ配列にしたほうがいいでしょうね。 #include <iostream> #include <vector> #include <algorithm> using namespace std; struct coordinate { int x; int y; }; // 比較関数 int compare(vector<coordinate>& a, vector<coordinate>& b) { return a[0].x < b[0].x; } // データの初期設定 void setup(vector< vector<coordinate> >& vec) { vector<coordinate> elements; coordinate element = { 0, 0 }; //[6, 5, 2] element.x = 6; elements.push_back(element); element.x = 5; elements.push_back(element); element.x = 2; elements.push_back(element); vec.push_back(elements); //[4, 1, 9, 7], elements.clear(); element.x = 4; elements.push_back(element); element.x = 1; elements.push_back(element); element.x = 9; elements.push_back(element); element.x = 7; elements.push_back(element); vec.push_back(elements); //[8, 3] elements.clear(); element.x = 8; elements.push_back(element); element.x = 3; elements.push_back(element); vec.push_back(elements); } // データの出力 void print(vector< vector<coordinate> >& vec) { for (vector< vector<coordinate> >::const_iterator i = vec.begin(); i != vec.end(); ++i) for (vector<coordinate>::const_iterator j = i->begin(); j != i->end(); ++j) cout << j->x << " "; cout << endl; } int _tmain(int argc, _TCHAR* argv[]) { vector< vector<coordinate> > dbVec; setup(dbVec); cout << "Before:" << endl; print(dbVec); sort(dbVec.begin(), dbVec.end(), compare); cout << "After:" << endl; print(dbVec); }
- qwertfk
- ベストアンサー率67% (55/81)
ご回答いただいた例では仕様が分かりません。 [4, 1, 9, 7], [6, 5, 2], [8, 3] ということですが、これではdbVecの要素数が多い順にソートしているようにしか見えず、 「xを昇順に」 と矛盾しています。 例示ではなく、どのような仕様でソートしたいのか、説明できますか?
- qwertfk
- ベストアンサー率67% (55/81)
そもそも2次元配列をソートしたいというのはどのような仕様でしょうか? xでソートするということなので、それ以外の成分を無視して、たとえば [6, 5, 2], [4, 1, 9, 7], [8, 3] dbVecのx値がこのような配列になっている場合、どのような結果になってほしいですか?
- Tacosan
- ベストアンサー率23% (3656/15482)
「そ~いう比較関数」を作ってやってください. 現実的な問題として, 本当に std::vector 同士を入れ替えたときにどのくらい時間がかかるかは知らんけど.
補足
その比較関数がうまくつくれないんです
補足
[4, 1, 9, 7], [6, 5, 2], [8, 3] という結果になってほしいです