C ++ (STL map) метод, эквивалентный setdefault Python

Так что, скорее всего, этот вопрос уже задавался. Не могу найти это.

Каждый раз, когда я определяю станд :: Карта и хочу вставить какое-то значение, я использую этот кусок кода:

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

Вопросы

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

5

Другие решения


По вопросам рекламы [email protected]