迭代map <string,unique_ptr <foo =“”>>

时间:2019-05-14 01:46:37

标签: c++11 unique-ptr stdmap

我看到这里存在一个非常接近的Q / A:Iterating over a container of unique_ptr's 但是,当涉及到map的迭代时,我看不到如何避免对unique_ptr进行复制/分配。

当我迭代地图时(例如,为了简单起见,使用c ++ 17),假设x是Foo的int类型的公共成员变量:

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:

我确实看到另一则帖子(Cannot iterate over map whose elements hold a uniq_ptr)在做

map<string, wrapper_struct > my_map;

其中wrapper_struct是内部带有unique_ptr的结构。我的问题是:有没有更简单的解决方案?

1 个答案:

答案 0 :(得分:0)

您可以对迭代器本身使用const引用,而不要使用对中的元素。

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