2011-02-25 33 views
74
sort(mMyClassVector.begin(), mMyClassVector.end(), 
    [](const MyClass & a, const MyClass & b) 
{ 
    return a.mProperty > b.mProperty; 
}); 

Örnek sınıfını bağlama yerine özel sınıfları sıralamak için bir lambda işlevi kullanmak istiyorum. Bu boost::bind(&MyApp::myMethod, this, _1, _2) ile çalışıyorBir lambda ile nasıl sıralanır?

error C2564: 'const char *' : a function-style conversion to a built-in type can only take one argument

: Ancak, kod yukarıdaki hata verir.

+0

Bu tür vektör nedir? – JaredPar

+0

Ne tür "mProperty" nedir? – wilhelmtell

+0

Vektör, bir tamsayı ve iki dizeyi içeren bir yapıdadır. Burada bir tamsayı var. – BTR

cevap

80

Anladım.

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

> Operatörün bir boole (her belge için) döndürdüğünü anladım. Ama görünüşe göre öyle değil.

+28

O ne palavra 'operatör>', o zaman. – GManNickG

+2

Şimdiye kadar yazdığınız şey çok az anlam ifade ediyor. Eğer mProperty bir int. A.mProperty> olması gerekiyorsa b.mProperty' kesinlikle bir bool verecektir. – sellibitze

+0

O zaman karışıklığımı anlıyorsun. VC10 Express'imle (servis paketi yok) garip bir şey olabileceğini düşünüyorum. Projeyi Visual Studio 2010 Ekibi ile bir makineye taşıdım ve "-> bool" olmadan çalıştı. – BTR

3

Sorun "a.mProperty> b.mProperty" satırı ile olabilir mi?

#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; 
}; 

çıkışı:

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

Evet, üzerinde çalıştığım kurulumla ilgili bir şey. Dizüstü bilgisayarımı, Visual Studio 2010'un Team sürümünde çok iyi bir şekilde tamamlamıyorum. Beni bağlamak için ne değiştirdiğimi ve hatanın gitmeyeceği konusunda beni ne şaşırttı. VC10 Express'teydim. Hata? – BTR

+0

Hiçbir fikir; Gönderdiğim kod derlendi ve g ++ ile iyi çalıştı. – Stephan

3

çok kod için, bu gibi kullanabilirsiniz:

#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" Değiştir Ben çalışmak aşağıdaki kodu ele verdik senin sınıfın ile ve bu kadar.

+0

Yanıtınız BTR'den nasıl farklı? Btw. std :: begin (vec) ve std :: end (vec) 'i daha C++ 11 yapmak için kullanabilirsiniz. – Logman

+0

Üzgünüz, bunu nasıl özledim bilmiyorum. Gözlerim Stephan post'ta duruyor. Benim kötü. (Önerilerinden sonra yazıyı değiştiriyorum) – John