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);

Вопросы

  1. Есть ли C++ предложить такой функционал?
  2. Если нет, все ли пишут эти 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 чехлы, я ничего не знаю. Вы могли бы получить эффект, предоставив специальный распределитель для карты, но я не думаю, что рекомендую это.

Другие вопросы по тегам