c++ - 有没有一种优雅的方法可以将一个双端队列的子集转移到另一个?

标签 c++ deque

也许是使用 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。

编写的模板有两个假设:

  1. 虽然源迭代器可以引用任何东西,但目标始终是双端队列;
  2. 要将原始元素重置为默认值是 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/

相关文章:

c++ - arrayList<string> 问题

c++ - 如何在C++中逐行将字符串转换为整数?

c++ - 我可以从同一项目中的另一个 ATL 简单对象访问 ActiveX 项目函数吗?

java - 无法解决 Java 双端队列迭代错误

c++ - 用于在容器 C++ 之间跳转的迭代器

c++ - 在 C++ 中构建多线程工作队列(消费者/生产者)

c++ - 如何在 C++ 中将文本附加到文本文件?

c - 反转循环双端队列 C 的顺序

c++ - 传递对 deque delete 函数的引用

c++ - 如何在不改变 QPlainTextEdit 类焦点的情况下检测文本的变化?