C ++ วนผ่านแผนที่


216

ฉันต้องการวนซ้ำในแต่ละองค์ประกอบmap<string, int>โดยไม่ทราบว่าเป็นค่าหรือคีย์สตริง

สิ่งที่ฉันมี:

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

คำตอบ:


491

คุณสามารถทำได้ดังนี้:

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

ด้วยภาษา C ++ 11 (และเป็นต้นไป) ,

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

ด้วยภาษา C ++ 17 (และเป็นต้นไป) ,

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

7
เพิ่มประเภท "auto" ที่อยู่ด้านหน้า "it"
iedoc

2
@ P0W ทำไม "auto const &" สำหรับ C ++ 11 แต่ "const auto &" สำหรับ C ++ 17 ความแตกต่างระหว่าง "auto const &" และ "const auto &"?
Eric

35
ไม่มีความแตกต่างมันเป็นแค่เรื่องของรสนิยม อย่างไรก็ตามดูเหมือนว่ารสชาติของ @ P0W นั้นไม่
สอดคล้องกัน

15
ขอบคุณสำหรับการอัปเดตด้วย C ++ 17 ฉันกำลังมองหาauto const& [key, val] : symbolTableรูปแบบ!
น้ำ

3
@haram คุณอาจต้องตั้งค่า "ISO C ++ 17 Standard (/ std: c ++ 17)" ในการตั้งค่าโครงการ (คุณสมบัติการกำหนดค่า> C / C ++> ภาษา> C ++ มาตรฐานภาษา)
Swordfish

27

ลองทำสิ่งต่อไปนี้

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

เดียวกันสามารถเขียนได้โดยใช้สามัญสำหรับวง

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

คำนึงถึงว่า value_type สำหรับstd::mapถูกกำหนดด้วยวิธีดังต่อไปนี้

typedef pair<const Key, T> value_type

ดังนั้นในตัวอย่างของฉัน p คือการอ้างอิง const ถึง value_type โดยที่ Key คือstd::stringและ T คือint

นอกจากนี้มันจะดีกว่าถ้ามีการประกาศฟังก์ชันเป็น

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

14

value_typeของmapเป็นpairที่มีคีย์และค่าเป็นมันfirstและsecondสมาชิกตามลำดับ

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

หรือด้วย C ++ 11 โดยใช้ช่วงตาม:

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

7

ในฐานะที่เป็น @Vlad จากมอสโกกล่าวว่าคำนึงว่าvalue_typeสำหรับstd::mapที่มีการกำหนดวิธีการต่อไปนี้:

typedef pair<const Key, T> value_type

ซึ่งหมายความว่าหากคุณต้องการแทนที่คำหลักautoด้วยตัวระบุประเภทที่ชัดเจนยิ่งขึ้นคุณสามารถทำได้

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

เพื่อความเข้าใจสิ่งที่autoจะแปลในกรณีนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.