dポイントプレゼントキャンペーン実施中!

構造体型の二次元のベクタをソートしたいのですがやりかたがよくわかりません。

struct coordinate{
int x;
int y;
};

vector< vector<coordinate> > dbVec;

上記のコードで、
dbVec[val][0].x  のxを昇順にval列をソートしたいです。
よろしくお願いします。

A 回答 (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;
coordinateelement = { 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);
}
    • good
    • 0

ご回答いただいた例では仕様が分かりません。



[4, 1, 9, 7],
[6, 5, 2],
[8, 3]

ということですが、これではdbVecの要素数が多い順にソートしているようにしか見えず、
「xを昇順に」
と矛盾しています。

例示ではなく、どのような仕様でソートしたいのか、説明できますか?
    • good
    • 0

そもそも2次元配列をソートしたいというのはどのような仕様でしょうか?



xでソートするということなので、それ以外の成分を無視して、たとえば


[6, 5, 2],
[4, 1, 9, 7],
[8, 3]

dbVecのx値がこのような配列になっている場合、どのような結果になってほしいですか?

この回答への補足

[4, 1, 9, 7],
[6, 5, 2],
[8, 3]

という結果になってほしいです

補足日時:2014/02/04 09:01
    • good
    • 0

「そ~いう比較関数」を作ってやってください.



現実的な問題として, 本当に std::vector 同士を入れ替えたときにどのくらい時間がかかるかは知らんけど.

この回答への補足

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

補足日時:2014/02/04 09:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!