Это проблема, которая относится и к указателям (итератор ведет себя очень похоже на указатель). Есть два способа доступа к члену значения указателя (или итератор) указывает на:
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;
}
Следует отметить, что существенное различие между карта и вектор пар - это то, что карта перестраивает элементы, сортируя их по их ключу. После этого порядок ввода не может быть запрошен. Есть случаи, когда вы не хотите этого делать (когда порядок вставки имеет значение), поэтому в таких случаях ваше решение или вектор с пользовательскими типами, содержащими хотя бы ключ и значение, являются правильным решением.
Возможно, вы захотите прочитать приоритет оператора, проверить '*' и '.' приоритет: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B – billz