C++ (STL map) эквивалентный метод по умолчанию для Python
Так что, скорее всего, этот вопрос уже задавался. Не могу найти это.
Каждый раз, когда я определяю std:: map и хочу вставить в него какое-то значение, я использую этот фрагмент кода:
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: setdefault, которая по существу объединяет эти 3 строки в одну красивую строку. Скажем, я хочу написать это на C++, это будет:
mapTmp.setdefault(iKey, IntVector()).push_back(iVal);
Вопросы
- Есть ли
C++
предложить такой функционал? - Если нет, все ли пишут эти 3 строки все время?
1 ответ
Карта, определенная стандартной библиотекой 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
чехлы, я ничего не знаю. Вы могли бы получить эффект, предоставив специальный распределитель для карты, но я не думаю, что рекомендую это.