std::reverse
头文件:#include <algorithm>
原型:
template<class BidirIt>
void reverse(BidirIt first, BidirIt last);
template<class ExecutionPolicy, class BidirIt>
void reverse(ExecutionPolicy&& policy, BidirIt first, BidirIt last); // C++17 并行版
作用:原地反转 [first, last) 区间内的元素顺序。
复杂度:正好交换 (last - first) / 2 次
空间复杂度:O(1)
注意事项:
-
区间是左闭右开
[first, last)- 反转前 k 个:
reverse(v.begin(), v.begin()+k) - 反转后 k 个:
reverse(v.end()-k, v.end()) - 反转
[L, R](闭区间):reverse(v.begin()+L, v.begin()+R+1)
- 反转前 k 个:
-
+k只能用于随机访问容器(vector, string, deque, array),不能用于 list -
k > size时要先k %= size -
空容器、
first == last或长度为 1 时,调用安全但无效果
代码示例:
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main() {
vector<int> v{1,2,3,4,5};
reverse(v.begin(), v.end()); // 全部反转 {5,4,3,2,1}
reverse(v.begin(), v.begin()+3); // 前3个反转 {3,2,1,4,5}
reverse(v.end()-2, v.end()); // 后2个反转 {3,2,1,5,4}
string s = "hello";
reverse(s.begin(), s.end()); // 字符串反转 "olleh"
}
std::reverse_copy
头文件:#include <algorithm>
原型:
template<class BidirIt, class OutIt>
OutIt reverse_copy(BidirIt first, BidirIt last, OutIt d_first);
作用:将 [first, last) 区间的元素反转后复制到目标容器,不改变原容器。
复杂度:执行 (last - first) 次赋值
空间复杂度:O(n)
注意事项:
- 目标区间必须足够大,否则越界
- 不改变原序列,只影响目标容器
- 区间是左闭右开
[first, last)
代码示例:
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v{1,2,3,4,5};
vector<int> result(v.size());
reverse_copy(v.begin(), v.end(), result.begin());
// v = {1,2,3,4,5}, result = {5,4,3,2,1}
reverse_copy(v.begin(), v.begin()+3, result.begin());
// result = {3,2,1,4,5}
}
379

被折叠的 条评论
为什么被折叠?



