486 Stimmen

Wie durchläuft man eine std::map?

Ich möchte durch jedes Element in der map iterieren, ohne irgendwelche seiner string-int-Werte oder Schlüssel zu kennen.

Was ich bisher habe:

void output(map tabelle)
{
       map::iterator it;
       for (it = tabelle.begin(); it != tabelle.end(); it++)
       {
            //Wie greife ich auf jedes Element zu?
       }
}

986voto

P0W Punkte 46279

Sie können dies wie folgt erreichen :

map::iterator it;

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

Mit C++11 (und später),

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

Mit C++17 (und später),

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

39voto

Vlad from Moscow Punkte 263567

Probieren Sie das Folgende aus

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

Das Gleiche kann auch mit einer normalen for-Schleife geschrieben werden

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

Beachten Sie, dass value_type für std::map folgendermaßen definiert ist

typedef pair value_type

Also, es wäre besser, wenn die Funktion wie folgt deklariert wird

void output( const map &table );

14voto

Columbo Punkte 58334

Der value_type einer map ist ein pair, das den Schlüssel und den Wert als sein first bzw. second Element enthält.

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

Oder mit C++11, unter Verwendung einer Range-basierten for-Schleife:

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

12voto

John Mutuma Punkte 2410

Wie @Vlad aus Moskau sagt, beachten Sie, dass value_type für std::map folgendermaßen definiert ist:

typedef pair value_type

Dies bedeutet dann, dass Sie, wenn Sie das Schlüsselwort auto durch einen expliziteren Typenspezifikator ersetzen möchten, Folgendes tun könnten;

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

Nur um zu verstehen, was auto in diesem Fall übersetzen wird.

12voto

Mital Vora Punkte 2156

Da P0W für jede C++-Version die vollständige Syntax bereitgestellt hat, möchte ich ein paar weitere Punkte hinzufügen, indem ich mir Ihren Code anschaue.

  • Nehmen Sie immer const & als Argument, um zusätzliche Kopien des gleichen Objekts zu vermeiden.
  • Verwenden Sie unordered_map, da es immer schneller ist. Siehe diese Diskussion

Hier ist ein Beispielcode:

#include <iostream>
#include <unordered_map>
using namespace std;

void output(const auto& table)
{
   for (auto const & [k, v] : table)
   {
        std::cout << "Key: " << k << " Value: " << v << std::endl;
   }
}

int main() {
    std::unordered_map<string, int> mydata = {
        {"one", 1},
        {"two", 2},
        {"three", 3}
    };
    output(mydata);
    return 0;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X