也许是使用 boost 还是其他方式?
我想创建一个函数,从(包括)索引 iStart 到索引 0 获取双端队列 d
的一个子集,放入一个新的双端队列中,同时在 d
到 0。我想到了这个:
std::deque<int> CreateSubset(std::deque<int>& d, int iStart )
{
int iSubsetSize = iStart+1;
std::deque<int> subset(iSubsetSize); // initialise a deque of a certain size.
std::deque<int>::iterator it = d.begin();
subset.assign (it, d.begin()+iStart+1);
for(;it != d.begin()+iStart+2; it++)
{
*it = 0;
}
return subset;
}
但我觉得这很糟糕 - 有更好的方法吗?
最佳答案
这是我在 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;
}
关于c++ - 有没有一种优雅的方法可以将一个双端队列的子集转移到另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17261217/