【发布时间】:2021-06-10 23:05:04
【问题描述】:
void rotate(vector <int> &a)
{
int lastElem = a[a.size()-1];
for(int i=a.size()-1;i>0;i--){
a[i] = a[i-1];
}
a[0] = lastElem;
}
对比
rotate(a.begin(),a.end()-1,a.end());
据我所知,上面的算法是 O(n) 那么为什么 STL 方式更快(我认为它也是线性时间)。
【问题讨论】:
-
有圆形数组这种东西吗?然后旋转可能是 O(1)。
-
[专业提示]
int lastElem = a[a.size()-1];可以替换为int lastElem = a.back(); -
STL 可以使用
memmove操作的组合? -
rotate交换元素,而您正在复制它们。尽管在int的情况下,这无关紧要。请包含您的基准测试代码,以证明差异。 -
@AdrianMole 看起来像这样,当 value_type 是 POD 时,GCC 对使用随机访问迭代器调用的
std::rotate有特殊的实现。它使用某种内部移动功能:github.com/gcc-mirror/gcc/blob/…
标签: c++ algorithm performance stl