2012-06-30 41 views
9

là bản đồ STL được đặt hàng?Có phải C++ std :: map <string, string> được sắp xếp không?

Cụ thể tôi cần biết liệu std :: map có được sắp xếp hay không. Vì vậy, nếu tôi lặp lại nó, nó sẽ lặp lại với chuỗi đầu tiên chèn đầu tiên.

Vì vậy, bên dưới sẽ lặp lại A, C rồi B ​​liên tục?

std::map<string,string> str_map; 

str_map.insert(std::make_pair("A","Data")); 
str_map.insert(std::make_pair("C","Data")); 
str_map.insert(std::make_pair("B","Data")); 
+4

Có, bạn thực sự có thể vượt qua chức năng so sánh của riêng bạn để bạn có thể yêu cầu nó theo thứ tự bạn muốn. http://www.cplusplus.com/reference/stl/map/ – leetNightshade

+2

CodingQuant: Trên thực tế ví dụ của bạn không phải là rất tốt, vì nó không phân biệt giữa hai ý nghĩa của "đặt hàng": thứ tự chèn, và thứ tự từ điển. std :: bản đồ bảo tồn * lexicographical * thứ tự, không chèn thứ tự. –

+3

@j_random_hacker: Để được pedantic, std :: bản đồ duy trì thứ tự từ điển chỉ khi vị từ so sánh của bạn dựa trên so sánh từ điển. –

Trả lời

25

là bản đồ STL được đặt hàng?

Vâng, một std::map<K,V> được sắp xếp dựa vào chìa khóa, K, sử dụng std::less<K> để so sánh các đối tượng, theo mặc định.

Vì vậy, nếu tôi lặp qua nó, nó sẽ lặp lại chuỗi đầu tiên đầu tiên?

No. Nó sẽ lặp lại dựa trên thứ tự được sắp xếp, không phải thứ tự mà bạn đã chèn phần tử. Trong trường hợp của std::string, nó sắp xếp theo thứ tự từ điển (thứ tự chữ cái).

Nếu bạn muốn lặp lại dựa trên thứ tự chèn, bạn nên sử dụng vùng chứa chuỗi, chẳng hạn như std::vector hoặc std::list.

+0

Cảm ơn - nhưng nó là phân loại chữ cái? Tôi đã cập nhật câu hỏi để đặt C trước B. Cảm ơn rất nhiều – CodingHero

+0

@CodingQuant: Đã cập nhật câu trả lời cho phù hợp. –

4

std::map s được sắp xếp bằng cách sử dụng một trong các loại nhất định operator< hoặc sử dụng hàm so sánh tùy chỉnh/functor nếu một được cung cấp làm đối số cho hàm tạo. Vì vậy, không, khi bạn lặp lại trên bản đồ, mục đầu tiên bạn nhận được sẽ không phải là thứ bạn đã chèn đầu tiên - nó sẽ là mục đầu tiên được sắp xếp theo thứ tự abc.

Tất nhiên đối với mã mẫu của bạn không tạo sự khác biệt vì "A" là khóa đầu tiên bạn chèn và cũng là khóa đầu tiên theo thứ tự bảng chữ cái.

+1

Theo mặc định std :: map sử dụng 'std :: less '. Cách hoạt động của nó phụ thuộc vào kiểu Key nhưng đối với các kiểu STL bình thường thì nó thường là 'toán tử <' –

Các vấn đề liên quan