C ++ Lặp qua bản đồ


216

Tôi muốn lặp qua từng phần tử map<string, int>mà không biết bất kỳ giá trị chuỗi hoặc khóa nào của 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?  
       }
}

3
Bản sao có thể có của Cách lặp qua bản đồ c ++
amanuel2

Câu trả lời:


487

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 ;
}

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

2
@ P0W Tại sao "auto const &" cho C ++ 11 nhưng "const auto &" cho C ++ 17? Có sự khác biệt nào giữa "auto const &" và "const auto &" không?
Eric

35
Không có sự khác biệt, đó chỉ là vấn đề của hương vị. Tuy nhiên, có vẻ như hương vị của @ P0W không nhất quán ...
Kapichu

15
Cảm ơn bạn đã cập nhật với C ++ 17, tôi đã tìm auto const& [key, val] : symbolTableđịnh dạng!
Nước

3
@haram Bạn có thể phải đặt "Tiêu chuẩn ISO C ++ 17 (/ std: c ++ 17)" trong cài đặt dự án (Thuộc tính cấu hình> C / C ++> Ngôn ngữ> Tiêu chuẩn ngôn ngữ C ++)
Swordfish

27

Hãy thử như sau

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

Điều tương tự có thể được viết bằng cách sử dụng một vòng lặp for thông thường

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

Hãy tính đến value_type cho std::mapđược định nghĩa theo cách sau

typedef pair<const Key, T> value_type

Do đó, trong ví dụ của tôi, p là tham chiếu const tới value_type trong đó Key là std::stringvà T làint

Ngoài ra, sẽ tốt hơn nếu hàm được khai báo là

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

14

Các value_typecủa một mappairchứa khóa và giá trị như nó firstsecondthà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 dựa trên:

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

7

Như @Vlad từ Moscow nói, Hãy tính đến value_typeviệc std::mapđược xác định theo cách sau:

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 autobằng một công cụ xác định loại rõ ràng hơn, thì bạn có thể làm điều này;

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

Chỉ để hiểu những gì autosẽ dịch sang trong trường hợp này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.