Так что, скорее всего, этот вопрос уже задавался. Не могу найти это.
Каждый раз, когда я определяю станд :: Карта и хочу вставить какое-то значение, я использую этот кусок кода:
using IntVector = vector < int > ;
map<int, IntVector> mapTmp;
int iKey = 7;
int iVal = 9;
if (mapTmp.find(iKey) == mapTmp.end())
mapTmp.insert(pair<int, IntVector>(iKey, IntVector()));
mapTmp[iKey].push_back(iKey);
Что меня раздражает, так это 3 строчки:
if (mapTmp.find(iKey) == mapTmp.end())
mapTmp.insert(pair<int, IntVector>(iKey, IntVector()));
mapTmp[iKey].push_back(iVal);
Python предлагает очень полезную функцию dict: установить по умолчанию, которые по существу объединяют эти 3 строки в одну красивую линию. Скажем, я хочу написать это на C ++, это будет:
mapTmp.setdefault(iKey, IntVector()).push_back(iVal);
C++
предложить такой функционал?Карта, определенная стандартной библиотекой C ++, имеет несколько нелогичное поведение, которое просто вызывает operator[]
Можно мутировать массив. Другими словами, ваша логика «если не в карте, а затем вставить по умолчанию» полностью излишня — следующие два сегмента эквивалентны:
if (mapTmp.find(iKey) == mapTmp.end())
mapTmp.insert(pair<int, IntVector>(iKey, IntVector()));
mapTmp[iKey].push_back(iVal);
а также:
mapTmp[iKey].push_back(iVal);
Во втором случае, если iKey
не существует на карте, сначала инициализируется по умолчанию. Для вектора это то же самое, что вставить пустой вектор.
Для общего случая, что Python setdefault
чехлы, я ничего не знаю. Вы могли бы получить эффект, предоставив специальный распределитель для карты, но я не думаю, что рекомендую это.