Làm cách nào để sắp xếp số này vector
bằng cách so sánh số pair.first
là số std::string
? (không cung cấp chức năng so sánh tĩnh, cũng không sử dụng tăng cường).Sắp xếp một std :: vector <std :: pair <std :: string, bool >> bởi chuỗi?
Trả lời
std::vector<std::pair<std::string, bool> > v;
std::sort(v.begin(), v.end());
std::pair
quá tải operator<
để sắp xếp đầu tiên bởi các yếu tố first
sau đó bởi các yếu tố second
. Do đó, nếu bạn chỉ cần sắp xếp các vector
bằng cách sử dụng thứ tự sắp xếp mặc định (operator<
), bạn sẽ nhận được thứ tự mong muốn của mình.
Bạn có thể sử dụng công cụ so sánh tùy chỉnh để đặt hàng trên các cặp '.first
chỉ.
sort(begin, end,
compose2(less<string>(),
select1st<pair<string, bool> >(),
select1st<pair<string, bool> >()));
Lưu ý rằng 'select1st' không phải là một phần của Thư viện chuẩn C++. –
Mmm. May mắn thay, nó không quan trọng để viết: 'template
Tôi thực sự thích James' câu trả lời, nhưng có một lựa chọn khác mà bạn có thể muốn xem xét - chỉ kênh tất cả mọi thứ vào một std::map
:
std::map<std::string, bool> myMap(v.begin(), v.end());
Hoặc, nếu bạn có các chuỗi trùng lặp, một std::multimap
:
std::multimap<std::string, bool> myMultiMap(v.begin(), v.end());
này không có lợi thế nói thêm rằng nếu sau đó bạn cần phải thêm hoặc loại bỏ cặp khóa/giá trị mới, bạn có thể làm như vậy trong thời gian O (lg n), như trái ngược với O (n) cho các vector được sắp xếp.
Nếu bạn thực sự phải sử dụng véc-tơ, sau đó đi với câu trả lời của James. Tuy nhiên, nếu bạn có một vectơ các cặp, có một cơ hội tốt mà bạn thực sự muốn có một std::map
.
Đây là câu trả lời duy nhất C++ 0x. ;) Edit: Bây giờ cố định ('>>' token đóng hai cặp lồng nhau '<>' cặp là C++ 0x chỉ). –
@Charles: Ha! Vâng, tôi có thể làm điều đó trong rất nhiều câu trả lời. Tôi quá quen với việc sử dụng trình biên dịch hỗ trợ '>>'. –
+1: Tôi không biết rằng 'std :: pair :: operator <()' đã bị quá tải. Tôi đang làm đây! –