SORU
11 Kasım 2008, Salı


Nasıl çift çifti ikinci unsuru tabanlı bir vektör sıralama?

Çift bir vektör var

std::vector<std::pair<int, int> > vec;

ve kolay bir şekilde artırmak amacıyla çifti ikinci unsuru göre sıralamak için var mı?

İş yapacak, ama orada STL ve std mevcut parçaları kullanmak için bir yol olduğunu küçük bir işlev nesnesi yazabilirim biliyorum::daha az işi doğrudan yapmak için?

EDİT: ayrı bir işlev veya sınıf sıralamak için üçüncü bağımsız değişken geçmek için yazabilirim bunu anlıyorum. Soru ya da bunu yapabilirim olup olmadığını standart şeyler dışında. Gerçekten benzer bir şey istiyorum

std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());

CEVAP
11 Kasım 2008, Salı


Sadece özel bir karşılaştırıcı (std::sort isteğe bağlı 3. bir argüman değil) kullanın

struct sort_pred {
    bool operator()(const std::pair<int,int> &left, const std::pair<int,int> &right) {
        return left.second < right.second;
    }
};

std::sort(v.begin(), v.end(), sort_pred());

Eğer C 11 bir derleyici kullanıyorsanız, aynı kullanarak Lambda yazabilirsiniz:

std::sort(v.begin(), v.end(), [](const std::pair<int,int> &left, const std::pair<int,int> &right) {
    return left.second < right.second;
});

EDİT: Sorunuzun düzenlemelerinizi yanıt olarak, burada bazı düşünceler ... eğergerçektenister yaratıcı olun ve bu kavramı yeniden muktedir bir sürü, bir şablon olun:

template <class T1, class T2, class Pred = std::less<T2> >
struct sort_pair_second {
    bool operator()(const std::pair<T1,T2>&left, const std::pair<T1,T2>&right) {
        Pred p;
        return p(left.second, right.second);
    }
};

o zaman bu da yapabilirsin:

std::sort(v.begin(), v.end(), sort_pair_second<int, int>());

hatta

std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());

Dürüst olmak gerekirse, bu biraz abartılı olur, ama sadece 3 satır fonksiyon yazın ve bitsin :-P

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GirlSanctuaryBlog

    GirlSanctuar

    28 Aralık 2011
  • Malwarebytes

    Malwarebytes

    22 Temmuz 2007
  • vgeller1

    vgeller1

    22 Kasım 2009