C++
1int v[5] = {3,2,5,7,1} 2//sort後 3v[5] = {1,2,3,5,7}
この時,配列の中身ではなくソート前の添字の値がほしいです.上の例だと求めている答えは{4,1,0,2,3}です.自分で調べてみましたが記事などからは理解することが出来なかったので,C++初心者にもわかるように教えていただけたら幸いです.よろしくお願いします.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ソート結果を配列のインデックスで得るのは、argsort といったりします。
インデックスを保持する配列を作成し、その配列を値の配列に基づき、ソートすることで、実現できます。
cpp
1#include <algorithm> 2#include <iostream> 3#include <numeric> 4#include <vector> 5 6int main() 7{ 8 std::vector<int> array = {3, 2, 5, 7, 1}; 9 10 // 配列のインデックス indiecs = {0, 1, 2, 3, 4} を作成する。 11 std::vector<size_t> indices(array.size()); 12 std::iota(indices.begin(), indices.end(), 0); 13 14 // ソートする。 15 std::sort(indices.begin(), indices.end(), [&array](size_t i1, size_t i2) { 16 return array[i1] < array[i2]; 17 }); 18 19 for (auto v : indices) 20 std::cout << v << " "; 21 std::cout << std::endl; 22}
4 1 0 2 3
投稿2018/10/06 02:32
編集2018/10/06 02:34総合スコア21960
0
ベストアンサー
私もy_waiwaiさんに賛成。
私なら
(元の)要素番号 と データをひとまとめにした構造体 ( クラスでもいいけど。 )を用意する。
C++
1struct Data{ 2 int ex_pos; // 元の位置 3 int num; // 実際のデータ 4};
この構造体の配列を用意。
C++
1Data d[5];
この構造体配列 d にセットしていく。
C++
1// 最初はex_posにセット 2for( int i = 0; i < 5; i++ ){ 3 d[i].ex_pos = i; // 1,2,3,...となるようにする 4} 5 6// 実際のデータを入れていく 7d[0].num = 5; 8d[1].num = 4; 9d[2].num = 0; 10... // 配列の末尾まで行う
で、バブルソートだったり、C++の STLの std::sortだっけ? あれでソートする。(d::num を基準として。)
すると
d[0] : 2, 0
d[1] : 3, 1
d[2] : 4, 2
...
のような感じで元の位置の番号を保持したまま動かせる。
仕様によってはクラスが保持することもあるし、一括で
int n[] = { 1, 2, 3, 4, 5 };
のやつみたいにする場合もあるが、ロジックに関しての質問なので適当。
投稿2018/10/06 02:30
総合スコア4962
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。