前提・実現したいこと
メンバ変数cx,cy,px,pyをもつ構造体C2Pをvectorコンテナc2pListに格納しています。構造体C2Pをメンバ変数pxとpyの大きさに応じてソートしたいと考えています。
表1のようにランダムに並んだC2Pを、表2のようにpyが昇順になるようにC2Pをソートしてからpyが同じ場合はpxが昇順になるようにC2Pをソートするといったイメージです。
下記のソースコードではC2Pの数が増えると動作が重くなってしまいます。for文を使わない単純な方法でソートしたいと考えています。アドバイスをお願いいたします。
<表1>
|cx|cy|px|py|
|:--|:--:|--:|
111|169|6|2
34|90|7|2
61|122|0|0
139|40|3|1
257|169|3|2
|8|113|0|0
252|47|2|2
55|8|5|2
148|190|1|0
113|194|0|1
190|60|7|2
1|97|1|1
<表2>
|cx|cy|px|py|
|:--|:--:|--:|
|8|113|0|0
61|122|0|0
148|190|1|0
113|194|0|1
1|97|1|1
139|40|3|1
252|47|2|2
257|169|3|2
55|8|5|2
111|169|6|2
34|90|7|2
190|60|7|2
発生している問題・エラーメッセージ
下記のソースコードでは無駄が多いのか座標数が多くなるとプログラムがうまく動作しません。そのため、もう少し単純な方法で実現したいと考えております。for文を使わずに実現することは可能でしょうか。
該当のソースコード
C++
1 2#include <vector> 3#include <algorithm> 4#include <random> 5using namespace std; 6 7struct C2P 8{ 9 int cx; 10 int cy; 11 int px; 12 int py; 13 14 C2P(int camera_x, int camera_y, int proj_x, int proj_y) 15 { 16 cx = camera_x; 17 cy = camera_y; 18 px = proj_x; 19 py = proj_y; 20 } 21}; 22//---最後尾から探索するfind_if------- 23template<class Iterator,class Predicate> 24Iterator find_last_if(Iterator begin, Iterator end, Predicate pred) 25{ 26 const auto rbegin = make_reverse_iterator(end); 27 const auto rend = make_reverse_iterator(begin); 28 auto found = find_if(rbegin, rend, pred); 29 30 return (found != rend) ? (++found).base() : end; 31} 32 33int main() 34{ 35 //データの用意 36 vector<C2P> c2pList; 37 38 39 for (int i = 0;i < 2000;i++) 40 { 41 for (int j = 0;j < 1000;j++) 42 { 43 c2pList.push_back(C2P(j, i, rand() % 100, rand() % 100) 44 } 45 } 46 47 //C2Pの最大値と最小値を調べる 48 auto max_px = max_element(c2pList.begin(), c2pList.end(), [](C2P& a, C2P& b) {return a.px < b.px;}); 49 auto min_px = min_element(c2pList.begin(), c2pList.end(), [](C2P& a, C2P& b) {return a.px < b.px;}); 50 auto max_py = max_element(c2pList.begin(), c2pList.end(), [](C2P& a, C2P& b) {return a.py < b.py;}); 51 auto min_py = min_element(c2pList.begin(), c2pList.end(), [](C2P& a, C2P& b) {return a.py < b.py;}); 52 53 int max_px_num = max_px->px; 54 int min_px_num = min_px->px; 55 int max_py_num = max_py->py; 56 int min_py_num = min_py->py; 57 58 //今回の質問の本題(ソートを行う) 59 sort(c2pList.begin(), c2pList.end(), [](C2P& a, C2P& b) { return a.py < b.py; });//pyを使いC2Pをソート 60 for (int i = min_py_num;i <= max_py_num;i++)//pxをソート 61 { 62 auto first_itr = find_if(c2pList.begin(), c2pList.end(), [&i](C2P& a) {return a.py == i;});//先頭のイテレータを取得 63 auto last_itr = find_last_if(c2pList.begin(), c2pList.end(), [&i](C2P& a) { return a.py == i; });//最後尾のイテレーターを取得 64 65 if (first_itr != c2pList.end() && last_itr != c2pList.end()&&first_itr!=last_itr) 66 { 67 sort(first_itr, last_itr + 1, [](C2P& a, C2P& b) { return a.px < b.px; }); 68 } 69 70 } 71 72 return 0; 73 74 75 76}
試したこと
補足情報(FW/ツールのバージョンなど)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/06 09:43
2020/12/06 10:04
2020/12/06 10:54