2013-09-16 69 views
9

Tôi muốn biết cách sắp xếp chuỗi vectơ sao cho chuỗi có số ký tự ít nhất nằm trên đầu vectơ. Ví dụ, nếu vector có ABCD, ABCDE, ABC trong đó. ABC được đầu trang. Tôi sẽ quan tâm để biết làm thế nào điều này có thể đạt được với sort_if và những gì vị ngữ sẽ như thế nào? Bất kỳ phương pháp khác cũng được chào đónphân loại vectơ chuỗi dựa trên kích thước chuỗi

+0

Không có 'std :: sort_if()'. Tuy nhiên, có quá tải 'std :: sort()'. Các vị ngữ sẽ, rõ ràng, so sánh chiều dài của các đối số và nếu chúng bằng nhau so sánh thứ tự từ điển của các chuỗi; nếu không nó sẽ trả về 'true' nếu đối số đầu tiên ngắn hơn. –

+0

FYI - những câu trả lời này hiện đã lỗi thời, không cần một nhà khai thác quá tải, chỉ cần sử dụng lambda! –

Trả lời

10

Hãy functor tùy chỉnh của riêng bạn để so sánh kích thước của chuỗi (s) và sử dụng để sắp xếp các chuỗi.

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

Bạn có thể muốn đặt các chuỗi theo từ điển nếu chúng có cùng chiều dài. Toán tử cuộc gọi hàm có thể là 'const'. –

+0

Bạn không cần phải thực hiện một functor để làm điều này. Một hàm so sánh đơn giản cũng sẽ làm điều đó. –

+0

@ DietmarKühl Tôi nghĩ bạn chỉ muốn ổn định nếu chúng có cùng chiều dài. Đoán đó là tùy thuộc vào người hỏi. – BoBTFish

5

nên có thể sử dụng thường xuyên std::sort(first, last, compare), và một hàm so sánh như thế này:

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

std::sort có một đối số tùy chọn để so sánh tùy chỉnh

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

Bạn chỉ có thể định nghĩa một hàm so sánh dựa trên chiều dài.