2013-09-16 10 views
9

Chciałem wiedzieć, w jaki sposób mogę posortować wektor łańcuchowy w taki sposób, aby ciąg z najmniejszą liczbą znaków był umieszczony na wierzchołku wektora. Na przykład, jeśli wektor ma ABCD, ABCDE, ABC w nim. ABC jest na szczycie. Chciałbym wiedzieć, jak można to osiągnąć dzięki sort_if i jak powinien wyglądać predykat? Wszelkie inne metody są również mile widzianesortowanie wektora ciągowego na podstawie rozmiaru ciągu znaków

+0

Nie jest to 'std :: sort_if()'. Istnieje przeciążenie predykatu 'std :: sort()' taking. Predykat oczywiście porównałby długość argumentów i jeśli są one równe, porównują kolejność leksykograficzną łańcuchów; w przeciwnym razie zwracałoby wartość "prawda", jeśli pierwszy argument jest krótszy. –

+0

FYI - te odpowiedzi są teraz bardzo nieaktualne, nie trzeba już przeciążać operatora, wystarczy użyć lambda! –

Odpowiedz

10

Zrób swój własny funktor porównania wielkości łańcucha (-ów) i użyć jej do sortuj struny.

struct compare { 
    bool operator()(const std::string& first, const std::string& second) { 
     return first.size() < second.size(); 
    } 
}; 

std::vector<std::string> v; 
compare c; 
std::sort(v.begin(), v.end(), c); 
+1

Prawdopodobnie chcesz zamówić łańcuchy leksykograficzne, jeśli mają one tę samą długość. Operator wywołania funkcji powinien być prawdopodobnie "const". –

+0

Nie musisz robić funktora, aby to zrobić. Prosta funkcja porównania również to zrobi. –

+0

@ DietmarKühl Myślę, że chcesz być stabilny, jeśli mają taką samą długość. Zgadnij, to zależy od pytającego. – BoBTFish

5

Powinny być w stanie korzystać z regularnych std::sort(first, last, compare) i porównać funkcję tak:

bool compareLen(const std::string& a, const std::string& b) 
{ 
    return (a.size() < b.size()); 
} 
2

std::sort pobiera opcjonalny argument dla porównania niestandardowego

template< class RandomIt, class Compare > 
void sort(RandomIt first, RandomIt last, Compare comp); 

Wystarczy zdefiniować funkcję, która porównuje na podstawie długości.

Powiązane problemy