我有一个类型为int的双端队列对象,其中包含很多元素,我的任务是从队列的前半部分获取所有元素并将其放在后面,然后从前面删除这些元素:例如[1, 2,3,4,5]将变为[3,4,5,1,2]。 当前执行此操作的代码是:
sys.path
是否有优化此过程的方法?
答案 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