2013-02-15 4 views
5

Почему я получаю ошибку ниже при доступе к значениям пары в итераторе вектора пар?Ошибка в получении значения из вектора пар

vector< pair<int,string> > mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (vector< pair<int,string> >::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << *it.first << " "   // <-- error! 
     << "2nd: " << *it.second << endl;  // <-- error! 
} 

Сообщение об ошибке:

main_v10.cpp:165:25: error: ‘std::vector > >::iterator’ has no member named ‘first’ main_v10.cpp:165:56: error: ‘std::vector > >::iterator’ has no member named ‘second’

Как я могу это исправить?

+1

Возможно, вы захотите прочитать приоритет оператора, проверить '*' и '.' приоритет: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B – billz

ответ

7

Это проблема, которая относится и к указателям (итератор ведет себя очень похоже на указатель). Есть два способа доступа к члену значения указателя (или итератор) указывает на:

it->first  // preferred syntax: access member of the pointed-to object 

или

(*it).first // verbose syntax: dereference the pointer, access member on it 

Оператор старшинство превращает выражение в

*(it.first) // wrong! tries to access a member of the pointer (iterator) itself 

который пытается получить доступ к члену first на самом итераторе, который терпит неудачу, потому что у него нет члена, называемого first. Если бы это произошло, вы бы разыменовали значение этого члена.


Однако в большинстве таких случаев вы должны использовать std::map на карту от ключа к значениям. Вместо vector<pair<int,string> >, вы должны использовать map<int,string>, который ведет себя аналогичные (вставки, итерацию и прочее также происходит с парами), но он сортирует ключи в структуре данных для более быстрого произвольного доступа:

map<int,string> mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (map<int,string>::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << it->first << " " 
     << "2nd: " << it->second << endl; 
} 

Следует отметить, что существенное различие между карта и вектор пар - это то, что карта перестраивает элементы, сортируя их по их ключу. После этого порядок ввода не может быть запрошен. Есть случаи, когда вы не хотите этого делать (когда порядок вставки имеет значение), поэтому в таких случаях ваше решение или вектор с пользовательскими типами, содержащими хотя бы ключ и значение, являются правильным решением.

+0

Я думаю, что второй вариант должен быть' (* это) .first' –

+0

@ g-makulik Конечно, спасибо. – leemes

+0

Да, второй вариант правильный! Благодарю. Ты восхитителен! –

Смежные вопросы