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

  • Dirty Loops

    Dirty Loops

    21 Mayıs 2007
  • paulandstorm

    paulandstorm

    4 EYLÜL 2006
  • The Dubstep FX

    The Dubstep

    5 Mart 2011