Как эффективно изменить std :: map? - PullRequest
0 голосов
/ 12 февраля 2012

Рассмотрим следующую ситуацию:

void doSmth1(std::map<int,int> const& m);

void doSmth2(std::map<int,int> const& m) {
  std::map<int,int> m2 = m;
  m2[42] = 47;
  doSmth1(m2);
}

Идея состоит в том, что doSmth2 вызовет doSmth1 и отправит карту, полученную от вызывающего абонента.Однако он должен добавить одну дополнительную пару ключ-значение (или переопределить ее, если она уже есть).Я хотел бы избежать копирования всего этого, просто чтобы передать дополнительное значение doSmth1.

1 Ответ

3 голосов
/ 12 февраля 2012

Вы не можете сделать это со стандартной картой.Но если ваша проблема настолько специфична, вы можете рассмотреть возможность передачи нового элемента отдельно:

void doSmth1(std::map<int, int> const & m, int newkey, int newvalue);

void doSmth2(std::map<int, int> const & m)
{
    doSmth1(m, 42, 47);
}

Обновление: Если вы действительно просто хотите одну карту, и копирование картыне может быть и речи, вот как можно реализовать предложение @ arrowdodger о временном изменении исходной карты:

void doSmth2(std::map<int, int> & m)
{
    auto it = m.find(42);

    if (it == m.end())
    {
        m.insert(std::make_pair(42, 49));
        doSmth1(m);
        m.erase(42);
    }
    else
    {
        auto original = it->second;
        it->second = 49;
        doSmth1(m);
        it->second = original;
    }
}
...