将对象从一个 std::d eque 移动到另一个的更好方法



如果我有两个std::deque,并且我想将前n对象从一个对象的开头移动到另一个对象的开头,那么最好的方法是什么? 执行以下操作:

template <typename T>
void fn(std::deque<T>& src)
{
  std::deque<T> storage;
  size_t i = /* some calculated value between 0 and src.size() */;
  storage.insert(storage.begin(), src.begin(), src.begin()+i);
  src.erase(src.begin(), src.begin()+i);
  // ... other stuff ...
}

将创建 T 对象的副本。 我想我可以做一些类似的事情(未测试,仅作为示例(:

template <typename T>
void fn(std::deque<T>& src)
{
  std::deque<T> storage;
  size_t i = /* some calculated value between 0 and src.size() */;
  for (auto& it = std::reverse_iterator<decltype(src.begin()>(src.begin()+i)
    ; it != std::reverse_iterator<decltype<src.begin()>(src.begin())
    ; ++it)
  {
    storage.push_front(std::move(*it));
  }
  src.erase(src.begin(), src.begin()+i);
  // ... other stuff ...
}

但我想知道,有没有一种算法已经可以处理这个问题?

通过调用 std::make_move_iterator 来使用移动迭代器:

storage.insert(storage.begin(),
  std::make_move_iterator(src.begin()),
  std::make_move_iterator(src.begin()+i));
src.erase(src.begin(), src.begin()+i);