首页 > 解决方案 > 将元素移出 unordered_set

问题描述

我有一个unordered_set<string>,我想消耗(即从)这个集合中的每个元素并用它做一些事情。从语法上讲,我看到了几种方法:

unordered_set<string> s = ...;

// 1
for (auto& x : s) {
  auto x2 = std::move(x);
  do_something(x2);
}

// 2
auto first = std::make_move_iterator(s.begin());
auto last = std::make_move_iterator(s.end());
while (first != last) {
  auto x2 = *first++;
  do_something(x2);
}

// 3
while (!s.empty()) {
  auto it = s.begin();
  auto x2 = std::move(*it);
  s.erase(it);
  do_something(x2);
}

但是,所有这些都让我担心我在迭代容器时正在修改容器。我怀疑至少 2 是安全的,因为这是有效的:

unordered_set<string> s;
vector<string> v;
v.insert(std::make_move_iterator(s.begin()),
         std::make_move_iterator(s.end()));

我不确定 1-3 中的任何一个是否被定义为安全/有效。如果是这样,我在哪里可以找到支持证据?如果没有,有什么安全的方法可以做我想做的事?

标签: c++c++11

解决方案


推荐阅读