• 締切済み

構造体型二次元ベクタのソート

構造体型の二次元のベクタをソートしたいのですがやりかたがよくわかりません。 struct coordinate{ int x; int y; }; vector< vector<coordinate> > dbVec; 上記のコードで、 dbVec[val][0].x  のxを昇順にval列をソートしたいです。 よろしくお願いします。

みんなの回答

回答No.4

#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)
回答No.3

ご回答いただいた例では仕様が分かりません。 [4, 1, 9, 7], [6, 5, 2], [8, 3] ということですが、これではdbVecの要素数が多い順にソートしているようにしか見えず、 「xを昇順に」 と矛盾しています。 例示ではなく、どのような仕様でソートしたいのか、説明できますか?

  • qwertfk
  • ベストアンサー率67% (55/81)
回答No.2

そもそも2次元配列をソートしたいというのはどのような仕様でしょうか? xでソートするということなので、それ以外の成分を無視して、たとえば [6, 5, 2], [4, 1, 9, 7], [8, 3] dbVecのx値がこのような配列になっている場合、どのような結果になってほしいですか?

wrusagi
質問者

補足

[4, 1, 9, 7], [6, 5, 2], [8, 3] という結果になってほしいです

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「そ~いう比較関数」を作ってやってください. 現実的な問題として, 本当に std::vector 同士を入れ替えたときにどのくらい時間がかかるかは知らんけど.

wrusagi
質問者

補足

その比較関数がうまくつくれないんです

関連するQ&A

専門家に質問してみよう