C++ Loop door kaart

Ik wil elk element in de map<string, int>doorlopen zonder de string-int-waarden of sleutels te kennen.

Wat ik tot nu toe heb:

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

Antwoord 1, autoriteit 100%

U kunt dit als volgt bereiken:

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

Met C++11( en verder ),

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

Met C++17( en verder ),

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

Antwoord 2, autoriteit 5%

Probeer het volgende

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

Hetzelfde kan worden geschreven met een gewone for-lus

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

Houd er rekening mee dat value_type voor std::mapop de volgende manier wordt gedefinieerd

typedef pair<const Key, T> value_type

Dus in mijn voorbeeld is p een const-referentie naar het value_type waarbij Key std::stringis en T int

is

Het zou ook beter zijn als de functie zou worden gedeclareerd als

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

Antwoord 3, autoriteit 2%

De value_typevan een mapis een pairdat de sleutel en waarde bevat zoals deze firsten secondlid, respectievelijk.

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

Of met C++11, op basis van bereik voor:

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

Antwoord 4

Zoals @Vlad uit Moskou zegt:
Houd er rekening mee dat value_typevoor std::mapop de volgende manier wordt gedefinieerd:

typedef pair<const Key, T> value_type

Dit betekent dan dat als u het zoekwoord autowilt vervangen door een meer expliciete typespecificatie, u dit kunt doen;

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

Alleen om te begrijpen waar autoin dit geval naar zal vertalen.


Antwoord 5

Aangezien P0W de volledige syntaxis voor elke C++-versie heeft geleverd, zou ik nog een paar punten willen toevoegen door naar uw code te kijken

  • Neem altijd const &als argument om extra kopieën van hetzelfde object te vermijden.
  • gebruik unordered_mapomdat het altijd sneller te gebruiken is. Zie deze discussie

hier is een voorbeeldcode:

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

Antwoord 6

het kan zelfs met een klassieke for-lus.
de iterator handmatig vooruitgaan.

typedef std::map<int, int> Map;
Map mymap;
mymap['a']=50;
mymap['b']=100;
mymap['c']=150;
mymap['d']=200;
bool itexist = false;
int sizeMap = static_cast<int>(mymap.size());
auto it = mymap.begin();
for(int i = 0; i < sizeMap; i++){
    std::cout << "Key: " << it->first << " Value: " << it->second << std::endl;
    it++;
}

Other episodes