这是我在 C++11 中的做法。我相信代码相当优雅,我不认为它有什么特别低效的地方:
#include <iostream>
#include <deque>
#include <iterator>
#include <algorithm>
template <typename ForwardIt>
std::deque<int> extract(ForwardIt from, ForwardIt to)
{
using std::make_move_iterator;
std::deque<int> d2(make_move_iterator(from),
make_move_iterator(to));
std::fill(from,to,0);
return d2;
}
函数模板采用extract()
两个前向迭代器,将它们之间的内容移动到新创建的双端队列中,并将其设置为原始的 0。
所写的模板做了两个假设:
- 尽管源迭代器可以引用任何东西,但目标始终是双端队列;
- 您要将原始元素重置为的默认值是 0。
通过引入更多的模板参数或函数参数,可以放宽这两个假设。
如您所见,我使用std::make_move_iterator
将输入迭代器转换为移动迭代器,从而导致元素被移动(而不是复制)到目的地。不过,只要这些是int
,它就不会真正有所作为。
我使用std::fill
算法将原始元素设置为 0。
这是您可以调用此函数模板的方式:
int main()
{
/* Creating d. */
std::deque<int> d
{ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
/* Extracting the first three elements into a new deque. */
auto d2 = extract(begin(d),begin(d) + 3);
/* Printing the results. */
std::cout << "d:\n";
for (const auto &elem : d)
std::cout << elem << ',';
std::cout << "\n\nd2:\n";
for (const auto &elem : d2)
std::cout << elem << ',';
std::cout << std::endl;
return 0;
}