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

时间:2018-04-19 19:08:30

标签: c++ c++11 c++14

如果我有两个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 ...
}

但我想知道,有没有一种算法可以解决这个问题?

1 个答案:

答案 0 :(得分:10)

通过调用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);