Итерационная карта - PullRequest
       22

Итерационная карта

0 голосов
/ 14 мая 2019

Я вижу, что здесь существует очень близкая Q / A: Итерация по контейнеру unique_ptr Однако, когда это включает итерацию карты, я не вижу, как избежать копирования / присвоения unique_ptr.

Когда я повторяю карту, например, используя c ++ 17 для простоты, предполагая, что x является публичной переменной-членом типа int для Foo:

map<string, unique_ptr<Foo> > my_map;
for (auto const& [key, val] : my_map) {
  val->x = 1;
}

Я получил ошибку:

constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const std::__cxx11::basic_string<char>; _T2 = std::unique_ptr<Foo>]’ is implicitly deleted because the default definition would be ill-formed:

Я вижу еще один пост ( Невозможно перебрать карту, элементы которой содержат uniq_ptr ), выполняя:

map<string, wrapper_struct > my_map;

где wrapper_struct является структурой с unique_ptr внутри. У меня вопрос: есть ли более простые решения?

1 Ответ

0 голосов
/ 14 мая 2019

Вы можете использовать константную ссылку на сам итератор вместо элементов в паре.

for (const auto& it : my_map) {
    auto ptr_to_unique_foo = it.second.get();
}
...