C++ programımda, anahtarlarım yerine haritalarımı değerlere göre sıralamaya çalışıyorum.Std :: set'i bildirirken sıralama alt yordamını neden tekrarlamam gerekiyor?
this question'dan itibaren, bunu yapmanın yolunun, öğeleri çiftleri olan ve kendimden daha az kendi işlevimle sıralanmış olan bir kümeyi oluşturmak olduğu anlaşılıyor gibi görünüyor.
eklemek Hakkında: A: 1
Eleman ok
Seti olduğunu ekledi Buradaçıktı: İşte Bunu deneyin bazı örnek kod boyutu: 1#include <map> #include <set> #include <iostream> #include <string> using namespace std; bool compareCounts(const pair<string, size_t> &lhs, const pair<string, size_t> &rhs); int main (int argc, char *argv[]) { map <string, size_t> counter = { {"A", 1}, {"B", 2}, {"C", 3} }; set <pair<string, size_t>, decltype(compareCounts) *> sorted_counter; for (map<string, size_t>::iterator it = counter.begin(); it != counter.end(); ++it) { cout << "About to add: " << it->first << ":" << it->second << endl; auto ret = sorted_counter.insert(*it); if (! ret.second) { cout << "ERROR adding this element!" << endl; } else { cout << "Element added ok" << endl; } cout << "Set is of size: " << sorted_counter.size() << endl; } return 0; } bool compareCounts(const pair<string, size_t> &lhs, const pair<string, size_t> &rhs) { return lhs.second > rhs.second; }
Hakkında ekleme: B: 2
Bölümlendirme hatası: 11
İkinci öğeyi eklemeye gittiğimde bazı şeylerin düştüğünü fark ettim. Bunun gerçekleştiğini anladım çünkü şimdi sıralama altprogramı olan compareCounts
'u aramak gerekiyor. Buna
set <pair<string, size_t>, decltype(compareCounts) *> sorted_counter;
:
düzeltme bu hattı değiştirmek oldu
set <pair<string, size_t>, decltype(compareCounts) *> sorted_counter(compareCounts);
Neden iki kere sıralama altprogramı compareCounts
belirtmek gerekiyor? Derleyici bunu benim tür tanımından zaten tanımıyor mu?
yerine functor kullanmalıyım? oldukça kafa karıştırıcı. lütfen kendi kendine yeten bir örnek verin – TemplateRex
Haritaları değerlere göre sıralamak için kullanıyorum. – EMiller
Bu isteğe bağlı bir şey mi yoksa her iki yapının daimi olarak eşleştirilmesi mi (şiddetle öneriyorum)? İsteğe bağlı olarak, bir std :: ref> 'öğesini bir vektöre atmak ve 'std :: sort()' komutunu kendi karşılaştırıcınızla mı atıyorsunuz? –
WhozCraig