2011-01-05 32 views

Trả lời

33
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.

+1

Đâ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ỉ). –

+0

@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ợ '>>'. –

+4

+1: Tôi không biết rằng 'std :: pair :: operator <()' đã bị quá tải. Tôi đang làm đây! –

0

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> >())); 
+2

Lưu ý rằng 'select1st' không phải là một phần của Thư viện chuẩn C++. –

+0

Mmm. May mắn thay, nó không quan trọng để viết: 'template struct select1st: public unary_function {const typename T :: first_type & operator() (const T & x) const {return x.first;}};' – ephemient

2

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.

+0

Tôi cần xem xét trường hợp người dùng không muốn họ được sắp xếp và theo thứ tự họ đã cung cấp cho họ. – jmasterx

+1

Ngoài ra vector + sắp xếp có thể trong thực tế nhanh hơn nhiều so với chèn nhiều thứ vào một bản đồ (đa), bất kể ký hiệu big-O nói gì. – Reunanen