algorithm头文件常用函数
reverse
倒转数组 reverse(v.begin(), v.end());
sort
基本用法
sort(first, last, comp);
- first: 指向要排序的序列的起始位置的迭代器
- last: 指向要排序的序列的结束位置的迭代器(不包含该位置)
- comp: 一个可选的比较函数或函数对象,用于定义排序的顺序。如果不提供,则默认使用
operator<
进行升序排序
进阶用法
你也可以提供一个自定义的比较函数或函数对象来控制排序的行为。例如,如果你想以降序排序,可以这样做:
1 | bool compare(int a, int b) { |
lambda表达式
在C++11及以后的版本中,你可以使用Lambda表达式来简化自定义比较函数的书写:
1 | int main() { |
注意事项
sort
函数使用的是快速排序算法,平均时间复杂度为O(n log n),但在最坏情况下(例如,数组已经排序)时间复杂度为O(n^2)。sort
函数会修改传入的序列,因此不适用于需要保持原序列不变的情况。- 确保传入的迭代器是有效的,并且
first
和last
之间的元素数量是合理的,以避免越界错误。
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 |
|
在这个例子中,std::rotate
将 vec
中从索引 1 开始的元素(即元素 2, 3, 4, 5
)移动到了向量的开头,而元素 1
被移动到了向量的末尾。
用法
- 第一个迭代器:指向序列中第一个元素的迭代器
- 第二个迭代器:指向序列中要旋转到第一个位置的元素的迭代器
- 第三个迭代器:指向序列中最后一个元素的迭代器
注意
请注意,std::rotate
的时间复杂度是 O(n),其中 n 是序列中元素的数量,因为它需要移动所有元素。对于大型数据集,这可能会有性能影响