2014-10-09 23 views
42

Tôi muốn lặp qua từng phần tử trong map<string, int> mà không biết bất kỳ giá trị hoặc khóa chuỗi-int nào của nó.C++ Lặp qua Bản đồ

Những gì tôi có cho đến nay:

void output(map<string, int> table) 
{ 
     map<string, int>::iterator it; 
     for (it = table.begin(); it != table.end(); it++) 
     { 
      //How do I access each element? 
     } 
} 
+2

Bản sao có thể có của [Cách lặp qua bản đồ C++] (http: // stackoverflow.com/questions/4844886/how-to-loop-through-ac-map) – amanuel2

Trả lời

117

Bạn có thể đạt được điều này như sau:

map<string, int>::iterator it; 

for (it = symbolTable.begin(); it != symbolTable.end(); it++) 
{ 
    std::cout << it->first // string (key) 
       << ':' 
       << it->second // string's value 
       << std::endl ; 
} 

Với C++ 11 (trở đi),

for (auto const& x : symbolTable) 
{ 
    std::cout << x.first // string (key) 
       << ':' 
       << x.second // string's value 
       << std::endl ; 
} 

Với C++ 17 (trở đi),

for(auto const& [key, val] : symbolTable) 
{ 
    std::cout << key   // string (key) 
       << ':' 
       << val  // string's value 
       << std::endl ; 
} 
+3

thêm loại "tự động" ở phía trước "nó" – iedoc

+0

@ P0W Tại sao "tự động const &" cho C++ 11 nhưng "const auto &" cho C++ 17? Bất kỳ sự khác biệt nào giữa "auto const &" và "const auto &"? – Eric

+1

Không có sự khác biệt, nó chỉ là vấn đề của hương vị. Tuy nhiên nó có vẻ như hương vị của @ P0W không phải là rất phù hợp ... – Kapichu

8

Các value_type của một map là một pair chứa khóa và giá trị vì nó là firstsecond thành viên, tương ứng.

map<string, int>::iterator it; 
for (it = symbolTable.begin(); it != symbolTable.end(); it++) 
{ 
    std::cout << it->first << ' ' << it->second << '\n'; 
} 

Hoặc với C++ 11, sử dụng phạm vi có trụ sở tại:

for (auto const& p : symbolTable) 
{ 
    std::cout << p.first << ' ' << p.second << '\n'; 
} 
14

Hãy thử như sau

for (const auto &p : table) 
{ 
    std::cout << p.first << '\t' << p.second << std::endl; 
} 

Cùng có thể được viết bằng một phổ thông trong vòng

for (auto it = table.begin(); it != table.end(); ++it ) 
{ 
    std::cout << it->first << '\t' << it->second << std::endl; 
} 

Xem xét v alue_type cho std::map được định nghĩa theo cách sau

typedef pair<const Key, T> value_type 

Như vậy trong ví dụ của tôi p là một tham chiếu const đến value_type nơi Key là std::string và T là int

Ngoài ra nó sẽ tốt hơn nếu các chức năng sẽ được công bố như

void output(const map<string, int> &table); 
0

như @Vlad từ Moscow cho biết, Đi vào tài khoản đó value_type cho std::map được định nghĩa các followi ng cách:

typedef pair<const Key, T> value_type 

Điều này có nghĩa là nếu bạn muốn thay thế từ khóa auto bằng một trình chỉ định loại rõ ràng hơn, thì bạn có thể thực hiện điều này;

for (const pair<const string, int> &p : table) { 
    std::cout << p.first << '\t' << p.second << std::endl; 
} 

Chỉ cần tìm hiểu xem auto sẽ dịch là gì trong trường hợp này.

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