ラムダで並べ替える方法は?


136
sort(mMyClassVector.begin(), mMyClassVector.end(), 
    [](const MyClass & a, const MyClass & b)
{ 
    return a.mProperty > b.mProperty; 
});

インスタンスメソッドをバインドする代わりに、ラムダ関数を使用してカスタムクラスを並べ替えたいのですが。ただし、上記のコードではエラーが発生します。

エラーC2564: 'const char *':組み込み型への関数スタイルの変換は1つの引数しか取れません

で正常に動作しboost::bind(&MyApp::myMethod, this, _1, _2)ます。


ベクトルは、整数と2つの文字列を含む構造体です。ここのプロパティは整数になります。
BTR

4
コンパイル可能な小さな例を示します。
GManNickG

回答:


157

とった。

sort(mMyClassVector.begin(), mMyClassVector.end(), 
    [](const MyClass & a, const MyClass & b) -> bool
{ 
    return a.mProperty > b.mProperty; 
});

>演算子が(ドキュメントごとに)ブール値を返したことがわかると思いました。しかし、明らかにそうではありません。


39
operator>では、なんとひどい。
GManNickG 2011

2
これまでに書いたことはほとんど意味がありません。mPropertyがintであるa.mProperty>b.mPropertyと想定されている場合、確実にブール値が生成されます。
ゼリビッツェ

1
その後、私の混乱を理解します。私のVC10 Express(サービスパックなし)では奇妙なものになると思います。プロジェクトをVisual Studio 2010 Teamがインストールされたマシンに移動したところ、「-> bool」なしで機能しました。
BTR、

8
そうoperator<ではないoperator>ですか?
ワープスペース2013

8
はい<、標準の昇順である必要があります。回答を編集して、それが降順であることを明確にしましたが、どうやら私の編集は役に立たず、ワイプされました!
2014年

18

多くのコードでは、次のように使用できます。

#include<array>
#include<functional>

int main()
{
    std::array<int, 10> vec = { 1,2,3,4,5,6,7,8,9 };

    std::sort(std::begin(vec), 
              std::end(vec), 
              [](int a, int b) {return a > b; });

    for (auto item : vec)
      std::cout << item << " ";

    return 0;
}

"vec"をクラスに置き換えれば、それで終わりです。


あなたの答えはBTRとどのように異なりますか?ところで std :: begin(vec)とstd :: end(vec)を使用して、よりc ++ 11にすることができます。
Logman 2017年

聞き取れませんでした。私の目はステファンのポストに止まります。私の悪い点(私はあなたの提案の後で投稿を変更します)
Adrian

5

「a.mProperty> b.mProperty」行に問題があるのでしょうか?次のコードを機能させました。

#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream>
#include <sstream>

struct Foo
{
    Foo() : _i(0) {};

    int _i;

    friend std::ostream& operator<<(std::ostream& os, const Foo& f)
    {
        os << f._i;
        return os;
    };
};

typedef std::vector<Foo> VectorT;

std::string toString(const VectorT& v)
{
    std::stringstream ss;
    std::copy(v.begin(), v.end(), std::ostream_iterator<Foo>(ss, ", "));
    return ss.str();
};

int main()
{

    VectorT v(10);
    std::for_each(v.begin(), v.end(),
            [](Foo& f)
            {
                f._i = rand() % 100;
            });

    std::cout << "before sort: " << toString(v) << "\n";

    sort(v.begin(), v.end(),
            [](const Foo& a, const Foo& b)
            {
                return a._i > b._i;
            });

    std::cout << "after sort:  " << toString(v) << "\n";
    return 1;
};

出力は次のとおりです。

before sort: 83, 86, 77, 15, 93, 35, 86, 92, 49, 21,
after sort:  93, 92, 86, 86, 83, 77, 49, 35, 21, 15,

ええ、私がいたセットアップで何かがおかしい。Visual Studio 2010のTeamエディションでラップトップなしでコンパイルすると問題ありません。バインドに切り替えてエラーが解消されなかった理由は何ですか。私はVC10 Expressを使用していました。バグ?
BTR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.