2011-12-13 37 views
11

Tôi có một myMap std :: mapsắp xếp trong std :: bản đồ, nơi quan trọng là một std :: string

Bây giờ, nếu tôi chèn giá trị trong bản đồ như:

std::map <string, string> mymap; 
mymap["first"] = "hi"; 
mymap["third"] = "how r you"; 
mymap["second"] = "hello"; 

Bây giờ tôi muốn để lặp qua bản đồ và in giá trị trong sắp xếp (phím) cách:

map<string, string>::iterator itr; 
for(itr = mymap.begin(); itr != mymap.end(); itr++) 
{ 
    string newline = itr->second; 
    cout << newline << endl; 
} 

Output nên là:

hi 
hello 
how r you 

Tôi nghĩ rằng theo mặc định các cửa hàng bản đồ trong các phím được sắp xếp theo cách nhưng tôi nhận được cùng một thứ tự trong đầu ra như tôi đang đưa vào đầu vào. Tôi có cần phải cung cấp chức năng sắp xếp của tôi cho điều này hay cần phải làm gì đó trước khi lặp lại trên bản đồ?

+3

Vòng lặp dùng để chỉ 'file_line' chứ không phải' mymap'. Tôi lấy nó đây không phải là mã thực tế như 'first' không được trích dẫn trong dân số' mymap'. – hmjd

+0

Tôi không hoàn toàn chắc chắn về C++ std :: bản đồ thực hiện, nhưng hashtables như vậy thường không được sắp xếp. Họ có nghĩa là để được truy cập thông qua chỉ mục, không đi qua. – Gigi

+2

@ user983064 std :: bản đồ là cây nhị phân, được sắp xếp theo khóa. C++ 11 có các bảng băm, chẳng hạn như std :: unordered_map. – juanchopanza

Trả lời

16

Các thành phần trong std::map được đặt hàng (theo mặc định) bởi operator< được áp dụng cho khóa.

Mã bạn đăng, với thay đổi nhỏ, làm việc cho tôi như bạn mong đợi:

std::map <string, string> mymap; 
mymap["first"]="hi"; 
mymap["third"]="how r you"; 
mymap["second"]="hello"; 

for (std::map<string, string>::iterator i = mymap.begin(); i != mymap.end(); i++) 
{ 
    cout << i->second << "\n"; 
} 

Prints:

hi 
hello 
how r you 
+0

uhmmmm ... những gì về "thứ tư" ?? Nó có nên sau "đầu tiên" hay "thứ ba" không? Có thể anh ta cần tùy chỉnh vị từ so sánh ... –

+0

@EmilioGaravaglia, vâng, anh ta sẽ hoặc chỉ sử dụng 'int' làm khóa. – hmjd

+2

'tự động'? câu hỏi này đã không được gắn thẻ là [tag: C++ 11] – juliomalegria

0

Thứ tự các mục nhập trong một số map được xác định trong tiêu chuẩn (tôi nghĩ), vì vậy nếu bạn muốn nó được sắp xếp, bạn phải tự làm điều đó. Ví dụ với hàm sort. Tuy nhiên, tôi không chắc liệu nó có hoạt động với map hay không. Nếu bạn muốn chắc chắn rằng nó được sắp xếp, tôi đề nghị bạn sao chép nó vào một vector hoặc một list và sắp xếp và xuất ra.

4

map thực sự là một tree và được sắp xếp theo thứ tự KEY. Bạn đang in itr->second là VALUE không phải là KEY. Nếu bạn muốn cặp khóa/giá trị của mình được sắp xếp theo VALUE, hãy sử dụng phím VALUE làm khóa thay thế hoặc lưu trữ mọi thứ trong vùng chứa khác (nói một mảng), sau đó sắp xếp chúng.

+1

Những gì bạn nói là chính xác, vì vậy KEYS là: "đầu tiên" <"thứ hai" <"thứ ba", do đó, chúng ta nên mong đợi kết quả tương tự như OP cho biết: 'hi | xin chào | làm thế nào r bạn', nhưng ông nói: _ Tôi đang nhận được cùng một thứ tự trong đầu ra như tôi đang cho input_, đó là: 'hi | làm thế nào r bạn | hello'. – juliomalegria

3

std :: bản đồ đã được đặt hàng. Nếu bạn đang sử dụng unordered_map, bây giờ bạn đã có một vấn đề!

Mục nhập trong std :: bản đồ được sắp xếp theo khóa hoặc itr-> đầu tiên. itr-> thứ hai khi bạn có nó, đề cập đến giá trị được liên kết với khóa.

Hơn nữa, bạn không lặp lại trên bản đồ, bạn đang lặp qua file_line (Tôi không biết đó là gì, nhưng tôi sẽ giả sử nó khác với mymap. Đó là những gì bạn nên lặp lại).

1

Các tiêu chuẩn định nghĩa:

Thuộc tính cơ bản của vòng lặp của container kết hợp là họ lặp qua các container theo thứ tự không giảm dần các phím mà không giảm dần được xác định bởi sự so sánh đã được sử dụng để xây dựng chúng.

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