none
STL のソート(std::sort関数) RRS feed

  • 質問

  • お世話になります。

    std::sort関数で、構造体のあるメンバを使用してソートをかけようと思っています。

    std::sort(fruits.begin(), fruits.end(), [](const fruit& x, const fruit& y){ return x.price > y.price; });

    サンプルをみてソートはできたのですが、第三引数の関数最初の「[]」の意味が分かりません。

    この[]はどういうことを意味しているのでしょうか。

    2014年12月22日 8:09

回答

  • C++11の機能の一つのラムダ式です。

    Web上には参考になるサイトがあるので調べてみてはどうでしょうか?


    わんくま同盟[http://blogs.wankuma.com/blue/]

    • 回答としてマーク Brillia 2014年12月24日 8:55
    2014年12月22日 8:19
  • ラムダ式構文の、式の外にある変数のキャプチャを指示する部分ですね。

    とりあえず「ラムダ式 C++」辺りで検索すれば色々解説が見つかるかと。

    • 回答としてマーク Brillia 2014年12月24日 8:55
    2014年12月22日 8:21
  • lambda式についてはみなさんが説明されているのでそれ以外を

    std::sort()には第3引数compを含まないバージョンがあります。その場合、std::less構造体を使って並び替えをします。更にstd::less<T>構造体のoperator()はT型のoperator<()を呼び出します。結果的に今回の例でいうと

    class fruit{
      ...;
      int price;
      ...;
    public:
      bool operator<(const fruit& other) const {
        return this.price < other.price;
      }
    }

    と定義しておくだけで、priceメンバー使用して昇順に並べ替えることができます。メンバー関数を使用しての並べ替えができるため、この例でのpriceをpublicにする必要もなくなります。降順にする場合はoperator>()を定義し、std::greaterを使います。

    • 回答としてマーク Brillia 2014年12月24日 8:55
    2014年12月22日 8:47

すべての返信

  • C++11の機能の一つのラムダ式です。

    Web上には参考になるサイトがあるので調べてみてはどうでしょうか?


    わんくま同盟[http://blogs.wankuma.com/blue/]

    • 回答としてマーク Brillia 2014年12月24日 8:55
    2014年12月22日 8:19
  • ラムダ式構文の、式の外にある変数のキャプチャを指示する部分ですね。

    とりあえず「ラムダ式 C++」辺りで検索すれば色々解説が見つかるかと。

    • 回答としてマーク Brillia 2014年12月24日 8:55
    2014年12月22日 8:21
  • lambda式についてはみなさんが説明されているのでそれ以外を

    std::sort()には第3引数compを含まないバージョンがあります。その場合、std::less構造体を使って並び替えをします。更にstd::less<T>構造体のoperator()はT型のoperator<()を呼び出します。結果的に今回の例でいうと

    class fruit{
      ...;
      int price;
      ...;
    public:
      bool operator<(const fruit& other) const {
        return this.price < other.price;
      }
    }

    と定義しておくだけで、priceメンバー使用して昇順に並べ替えることができます。メンバー関数を使用しての並べ替えができるため、この例でのpriceをpublicにする必要もなくなります。降順にする場合はoperator>()を定義し、std::greaterを使います。

    • 回答としてマーク Brillia 2014年12月24日 8:55
    2014年12月22日 8:47
  • ご返事ありがとうございます。

    ラムダ式というのですか。
    調べるキーワードもわからなかったので。。。

    ありがとうございました。

    佐祐理さんのコードを試しました。なんかすごいですね。

    STLの勉強を始めたいと思うのですが、なんかいい書籍があれば教えてください。


    • 編集済み Brillia 2014年12月24日 9:07
    2014年12月24日 8:55
  • C++言語は今、かなり早いペースで進化しています。書籍に書かれていることと合わなかったりもします。更には規格として定まっていても、Visual C++で実装されているとは限らないため注意が必要です。最低限、VS2013 Update4を使いましょう。

    STLも結局はC++言語で書かれていますので、C++ 標準ライブラリのヘッダー ファイルと照らし合わせながらヘッダーファイルを覗いていくのはどうでしょうか? 例えばstd::threadはコンストラクターで任意の関数や引数を受けるのになぜtemplateクラスにならずに済むのか、とかとか。Visual C++に付属するわけですからそこに書かれている全てが動作します。
    # VS2013の新機能になるAlt+F12はヘッダーファイルを辿っていく際に有用です。

    2014年12月24日 15:04