質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

1041閲覧

c++: vectorのソートにつきまして

guriguri

総合スコア34

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/03/31 09:36

質問内容

std::vector をソートしたのですが不可解な挙動に遭遇しております。
vectorをソートした直後は想定通りにソートされているのですが、別の箇所から同じvectorにアクセスするとソートされていません。

func1()でvector内のMyStructのvalueの値で昇順にソートします。
func2()で確認するとソートされていませんん。

c++

1struct MyStruct { 2 int value; 3} 4 5std::map<string, std::vector<MyStruct>> mp; 6 7void func1(){ 8 for (auto m: mp) { 9 10 // vectorの内容をMyStructのvalueで昇順にソート 11 std::sort( 12 mp.second.begin(), 13 mp.second.end(), 14 [](const MyStruct &x, const MyStruct &y) { return x->value > y->value; }); 15 16 // vectorの並びを表示: 想定通りソートされている 17 for (MyStruct &s : mp.second) { 18 Logger::writeLog("MyStruct value=%d", s->value); 19 } 20 } 21} 22 23void func2(string &key){ 24 auto &m = mp[key]; 25 for (MyStruct &s : m) { 26 // vectorの並びを表示: ソートする前の順序に戻っている 27 Logger::writeLog("MyStruct value=%d", s->value); 28 } 29}

std::sortが破壊的ではないのかと思ったのですが、それだとどちらとも失敗するはずですし・・・。
iteratorをend()のまま再利用しているわけでもないですし。(それだと結果が何も表示されないですが。)

どこに誤りがあるのでしょうか?

どうぞ宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/03/31 09:56

そのコードではコンパイルが通らないのでどうしようもない. 問題が再現する「動作可能な」コードを提示してください.
guriguri

2020/03/31 11:44

再現するコードがかなり複雑なので端折ってました。 mpのループの箇所が間違っておりました。 ご返信ありがとうございました。
guest

回答1

0

for (auto m: mp)ではmには要素のコピーが入っています。
for (auto& m: mp)とすればうまく行くと思います。
また、ループ内のmpmのタイプミスでしょう。

投稿2020/03/31 09:51

編集2020/07/11 06:51
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki23

2020/03/31 10:16

forループの中で`m`を使っていないので、それだけでは直らないかと
SHOMI

2020/03/31 10:30 編集

コピペせずに書いていてfor内のmpはmの打ち間違いかなと
SHOMI

2020/03/31 10:40

だとするとfor部分も記述通りかわからないですね… fanaさんも書かれていますが、動作に関係のない箇所は省略しても良いのでコンパイルの通る実際のコードを貼り直してください。
guriguri

2020/03/31 11:44

すみません、コードを端折ってました。 `for (auto& m: mp)`が正解でした。 参照には気をつけていたのですが外のループなので全く気になっておりませんでした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問