람다로 정렬하는 방법?


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

인스턴스 메소드를 바인딩하는 대신 람다 함수를 사용하여 사용자 정의 클래스를 정렬하고 싶습니다. 그러나 위의 코드는 오류를 생성합니다.

오류 C2564 : 'const char *': 내장 유형으로의 함수 스타일 변환은 하나의 인수 만 취할 수 있습니다.

와 잘 작동합니다 boost::bind(&MyApp::myMethod, this, _1, _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

2
지금까지 쓴 내용은 의미가 없습니다. mProperty가 int 인 a.mProperty>b.mProperty경우 분명히 bool을 생성합니다.
sellibitze

1
그럼 당신은 내 혼란을 이해합니다. VC10 Express (서비스 팩 없음)에 이상이있을 수 있습니다. Visual Studio 2010 Team을 사용하여 프로젝트를 컴퓨터로 옮기고 "-> bool"없이 작업했습니다.
BTR

8
그것은해야하지 operator<,하지 operator>?
Warpspace

8
<, 표준 오름차순 이어야합니다 . 나는 그것이 내림차순이라는 것을 분명히하기 위해 대답을 편집했지만 분명히 내 편집은 도움이되지 않았으며 지워졌습니다!
팬케이크

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과 어떻게 다릅니 까? Btw. std :: begin (vec) 및 std :: end (vec)를 사용하여 더 C ++ 11로 만들 수 있습니다.
Logman

미안, 내가 어떻게 그리웠는지 모르겠다. Stephan post에서 눈이 stop니다. 내 나쁜. (나는 당신의 제안 후 게시물을 수정)
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.