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::map
op 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::string
is 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_type
van een map
is een pair
dat de sleutel en waarde bevat zoals deze first
en second
lid, 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_type
voor std::map
op de volgende manier wordt gedefinieerd:
typedef pair<const Key, T> value_type
Dit betekent dan dat als u het zoekwoord auto
wilt 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 auto
in 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_map
omdat 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++;
}