SORU
4 EYLÜL 2009, Cuma


Özel nesneleri bir vektör sıralama

Nasıl bir vektör içeren özel sıralama (kullanıcı tanımlı yani) nesneleri yok.< / ^ br . Muhtemelen, standart STL algoritmasısıralamaözel alanlar (sıralama için bir anahtar olarak) üzerinde faaliyet gösterecek olan bir yüklem (bir işlev veya işlev nesnesi) ile birlikte nesne kullanılmalıdır.< / ^ br . Doğru yolda mıyım?

CEVAP
4 EYLÜL 2009, Cuma


Basit bir örnek std::sort kullanarak

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}
};

struct less_than_key
{
    inline bool operator() (const MyStruct& struct1, const MyStruct& struct2)
    {
        return (struct1.key < struct2.key);
    }
};

std::vector < MyStruct > vec;

vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(3, "a"));
vec.push_back(MyStruct(2, "is"));
vec.push_back(MyStruct(1, "this"));

std::sort(vec.begin(), vec.end(), less_than_key());

Düzenleme:Kirill V. Lyadvinsky, yüklem bir tür sağlama yerine belirttiği gibi, geçersiz kılma&; MyStruct operatör lt:

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}

    bool operator < (const MyStruct& str) const
    {
        return (key < str.key);
    }
};

Bu yöntemi kullanarak sadece aşağıdaki gibi vektör tür anlamına gelir

std::sort(vec.begin(), vec.end());

Edit2:Olarak Kappa da geçersiz ^ göre azalan sırada vektör sıralayabilirsiniz gösteriyor . operatör ve bir nevi Ara biraz değiştirerek:

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}

    bool operator > (const MyStruct& str) const
    {
        return (key > str.key);
    }
};

Ve sıralama aramalısın:

std::sort(vec.begin(), vec.end(),greater<MyStruct>());

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • PaulGBelliveau

    PaulGBellive

    5 Mart 2009
  • TechSmartt

    TechSmartt

    29 Aralık 2010
  • xiaoyu85

    xiaoyu85

    20 ŞUBAT 2010