2015-04-23 5 views
1

Я пытаюсь использовать unordered_map в C++, так что для ключа у меня есть int, в то время как для значения есть пара поплавков. Но я не уверен, как получить доступ к паре ценностей. Я просто пытаюсь понять эту структуру данных. Я знаю, что для доступа к элементам нам нужен iterator того же типа, что и эта неупорядоченная декларация карты. Я пробовал использовать iterator->second.first и iterator->second.second. Это правильный способ сделать элементы доступа?unordered_map пара значений C++

typedef std::pair<float, float> Wkij; 
tr1::unordered_map<int, Wkij> sWeight; 
tr1::unordered_map<int, Wkij>:: iterator it; 
it->second.first  // access the first element of the pair 
it->second.second // access the second element of the pair 

Благодарим за помощь и время.

+3

Составляет ли оно? –

+1

'unordered_map' является частью стандарта C++ 11, вы можете использовать' std :: 'вместо' tr1 :: ' – Alejandro

+1

, вы также можете использовать' std :: get <0> (it-> second) 'или' std :: get <0> (std :: get <1> (* it)) '(оба дают' it-> second.first', что совершенно верно) –

ответ

2

Да, это правильно, но не используйте tr1, напишите std, так как unordered_map уже входит в состав STL.

Используйте итераторы, как вы сказали

for(auto it = sWeight.begin(); it != sWeight.end(); ++it) { 
    std::cout << it->first << ": " 
       << it->second.first << ", " 
       << it->second.second << std::endl; 
} 

Кроме того, в C++ 11 вы можете использовать диапазон на основе цикл

for(auto& e : sWeight) { 
    std::cout << e.first << ": " 
       << e.second.first << ", " 
       << e.second.second << std::endl; 
} 

И если вам это нужно, вы можете работать с std::pair как это

for(auto it = sWeight.begin(); it != sWeight.end(); ++it) { 
    auto& p = it->second; 
    std::cout << it->first << ": " 
       << p.first << ", " 
       << p.second << std::endl; 
} 
+0

Спасибо, @НиколайКондратьев. Это очень полезно! – TMath