从双端队列移除双端队列,然后将它们放回后端

时间:2018-11-08 20:01:55

标签: c++ deque

我有一个类型为int的双端队列对象,其中包含很多元素,我的任务是从队列的前半部分获取所有元素并将其放在后面,然后从前面删除这些元素:例如[1, 2,3,4,5]将变为[3,4,5,1,2]。 当前执行此操作的代码是:

sys.path

是否有优化此过程的方法?

1 个答案:

答案 0 :(得分:1)

您可以使用std :: rotate这样:

   std::rotate( myDeque.begin(), myDeque.begin() + dequeSize/2, myDeque.end()); 

完整测试:

#include <iostream>
#include <chrono>
#include <deque>
#include <algorithm> // std::rotate


void printDequeBegin(const std::deque<int>& aDeque)
{
   auto d {aDeque.cbegin()};
   auto i {0};
   while (i < 10 && d != aDeque.cend())
   {
      std::cout << *d++ << " ";
      ++i; 
   }
   std::cout << "\n";
}


int main()
{

   const int dequeSize { 9000000 };
   std::deque<int> myDeque;

   for (int i = 0; i < dequeSize; )
   {
      myDeque.push_back(++i);
   }

   printDequeBegin(myDeque);

   auto start {std::chrono::system_clock::now()};

   std::rotate( myDeque.begin(), myDeque.begin() + dequeSize/2, myDeque.end()); 

   auto end {std::chrono::system_clock::now()};

   auto ms {std::chrono::duration_cast<std::chrono::milliseconds>(end-start)};
   std::cout << ms.count() << " ms\n";

   printDequeBegin(myDeque);

   return 0;
}

输出:

1 2 3 4 5 6 7 8 9 10 
326 ms
4500001 4500002 4500003 4500004 4500005 4500006 4500007 4500008 4500009 4500010