Я использую пару строк в качестве ключа на моей карте и int в качестве значения. Я хочу выполнить поиск по карте, и если точная пара уже существует, увеличьте значение, иначе вставьте пару в карту (со значением 1). Он компилирует, однако, на самом деле он не находит пары, которые уже существуют, он только вставляет. (вывод только для целей тестирования). Я думаю, что проблема с использованием .find () с парой, но не уверен, как это исправить …
Код, который вы показали, кажется правильным. Можете ли вы продемонстрировать с полным примером, включая main
?
Кроме того, я думаю, что вы могли бы сойти с рук operator[]
:
++pairs[std::make_pair(*slow, *fast)];
Однако реальная проблема, вероятно, в том, что вы ожидаете pairs
быть параметром «out», пока вы передаете его по значению. Ваша функция эффективно только изменяет копию контейнера. Вы хотите взять это по ссылке вместо этого. map<pair<string, string>, int> findPairs(map<pair<std::string,std::string>, int>& pairs, multiset<string> artists){
(Обратите внимание &
перед pairs
параметр).
В почтовом индексе нет ничего плохого
Тем не менее, вы делаете слишком много, чем требуется. Например, этот код
yo=pairs.find(p);
if (yo==pairs.end())
{
pairs.insert(make_pair(p,1));
cout<<"inserted"<<endl;
}
else
{
yo->second+=1;
cout<<"entered"<<endl;
}
в точности эквивалентно этому:
pairs.insert(make_pair(p,1)).first->second += 1;
что в точности эквивалентно этому:
++pairs[p];
что означает, что весь код может быть заменен просто ++pairs[p]
или просто так:
++pairs[make_pair(*slow, *fast)];
так как p
является make_pair(*slow, *fast)
, в конце концов.