reverse

倒转数组 reverse(v.begin(), v.end());

sort

基本用法

sort(first, last, comp);

  • first: 指向要排序的序列的起始位置的迭代器
  • last: 指向要排序的序列的结束位置的迭代器(不包含该位置)
  • comp: 一个可选的比较函数或函数对象,用于定义排序的顺序。如果不提供,则默认使用operator<进行升序排序

进阶用法

你也可以提供一个自定义的比较函数或函数对象来控制排序的行为。例如,如果你想以降序排序,可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool compare(int a, int b) {
return a > b; // 降序排序
}

int main() {
std::vector<int> vec = {5, 3, 8, 4, 2};
std::sort(vec.begin(), vec.end(), compare);

for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;

return 0;
}

lambda表达式

在C++11及以后的版本中,你可以使用Lambda表达式来简化自定义比较函数的书写:

1
2
3
4
5
6
7
8
9
10
11
12
13
int main() {
std::vector<int> vec = {5, 3, 8, 4, 2};
std::sort(vec.begin(), vec.end(), [](int a, int b) {
return a > b; // 降序排序
});

for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;

return 0;
}

注意事项

  • sort函数使用的是快速排序算法,平均时间复杂度为O(n log n),但在最坏情况下(例如,数组已经排序)时间复杂度为O(n^2)。
  • sort函数会修改传入的序列,因此不适用于需要保持原序列不变的情况。
  • 确保传入的迭代器是有效的,并且firstlast之间的元素数量是合理的,以避免越界错误。

unique

函数作用

std::unique 函数的作用是移除容器中所有连续重复的元素,只保留每个元素的第一个出现。它不会真正从容器中删除元素,而是将所有重复的元素移动到容器的末尾,并返回一个新的迭代器,指向新的逻辑结束位置。

返回值

std::unique 函数返回的迭代器是一个指向新逻辑结束位置的迭代器。这个迭代器指向的位置是第一个不重复元素之后的位置,即所有重复元素都被移动到这个位置之后。

迭代器类型

unique(v.begin(), v.end()) 返回的迭代器类型与传入的迭代器类型相同。如果 v 是一个 std::vector,那么返回的迭代器就是 std::vector<int>::iterator 类型;如果 v 是一个 std::list,那么返回的迭代器就是 std::list<int>::iterator 类型。

示例

假设 v 是一个 std::vector<int>,那么 v.begin()v.end() 分别是指向 v 的第一个元素和最后一个元素之后的位置的迭代器。unique(v.begin(), v.end()) 会处理这个范围内的所有元素,移除连续重复的元素,并返回一个新的迭代器,指向新的逻辑结束位置。

使用场景

这个返回的迭代器通常用于与容器的 erase 方法结合使用,以实际从容器中移除重复元素.v.erase(unique(v.begin(), v.end()), v.end());

rotate

作用

这个函数可以对序列(如数组、容器等)中的元素进行循环移动。它将序列中从第一个参数指定的位置开始的所有元素移动到序列的前面,而序列中的第一个元素被移动到最后一个指定的位置

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <algorithm>
#include <vector>
#include <iostream>

int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};

// 将vec中从位置1开始的元素(包括1)移动到vec的开头
std::rotate(vec.begin(), vec.begin() + 1, vec.end());

// 输出旋转后的向量
for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
//2 3 4 5 1

return 0;
}

在这个例子中,std::rotatevec 中从索引 1 开始的元素(即元素 2, 3, 4, 5)移动到了向量的开头,而元素 1 被移动到了向量的末尾。

用法

  • 第一个迭代器:指向序列中第一个元素的迭代器
  • 第二个迭代器:指向序列中要旋转到第一个位置的元素的迭代器
  • 第三个迭代器:指向序列中最后一个元素的迭代器

注意

请注意,std::rotate 的时间复杂度是 O(n),其中 n 是序列中元素的数量,因为它需要移动所有元素。对于大型数据集,这可能会有性能影响