Оператор цепочки [] на вложенной карте структуры - PullRequest
1 голос
/ 07 октября 2019

У меня есть следующее:

struct A { std::map<int, B> b; }
struct B { std::map<int, C> c; };
std::map<int, A> a;

И я хотел бы заполнить a значениями внутри цикла for:

for(int i : ...)
  for(int j : ...)
    for(int k : ...)
      a[i].b[j].c.emplace(k, <args to constructor of C>);

Это неэффективно? Будут ли построены объекты A и B в вызовах a[i] и b[j] на месте? Зависит ли ответ от того, как часто a[i] и b[j] приводят к вставке против присвоения? Можно ли это сделать менее многословно, используя try_emplace?

1 Ответ

2 голосов
/ 07 октября 2019

Вопрос

Это неэффективно?

Немного. Вы можете хранить ссылки на a[i] и a[i].b[j] локально, чтобы избежать множественных вызовов.

for(int i : ...)
{
  auto& aref = a[i;
  for(int j : ...)
  {
    auto& bref = aref.b[j];
    for(int k : ...)
    {
      bref.c.emplace(k, <args to constructor of C>);
    }
  }
}

Вопрос

Будут ли объекты A и B в вызовах к [i] и b [j] будут построены на месте?

Да.

С https://en.cppreference.com/w/cpp/container/map/operator_at:

Вставка value_type(key, T()), если ключ делаетне существует.

Вопрос

Зависит ли ответ от того, как часто a [i] и b [j] приводят к вставке и присваиванию?

Нет.

Вопрос

Можно ли сделать это менее подробным способом с использованием try_emplace?

IНе понятно, о чем вы здесь спрашиваете.

...