C++标准模板库(STL)提供了丰富的算法,用于在容器上执行各种操作。下面是一些常用的STL算法:
一.使用前的准备:
#include <algorithm> //包含<algorithm>头文件
using namespace std;
二.常用算法举例:
1.sort(start,end):
1.1函数作用:
默认对容器中的指定范围[start,end)(注意不包含end位置的元素!)内的元素进行升序排序。
1.2参数解释:
start表示要排序的起始位置的迭代器,指向待排序范围的第一个元素。
end表示要排序的结束位置的迭代器,指向待排序范围的最后一个元素的下一个位置。
sort()函数将使用升序的方式对指定范围[start,end)内的元素进行排序,默认使用 <
运算符进行比较。
1.3使用举例:
#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;
int main()
{
vector<int> vec = {5, 9, 3, 5, 7, 1, 8, 6};
auto start = vec.begin(); // 创建一个迭代器start并指向vector的开始
auto end = vec.end(); // 创建一个指向vector的末尾的下一个位置的迭代器
sort(start, end); // 使用std::sort函数对vector中的元素排序
printf("排序后的vec为:\n");
for (int i = 0; i < vec.size(); i++)
{
printf("%d ", *(it1 + i)); // 通过迭代器it1来访问并打印排序后的元素
}
}
//输出:
排序后的vec为:
1 3 5 5 6 7 8 9
2.find(start,end,element):
2.1函数作用:
在容器的指定范围[start,end)(注意不包含end位置的元素!)中查找特定值的第一个出现位置,返回指向该位置的一个迭代器。
2.2参数解释:
start:指向容器中要搜索的起始位置的一个迭代器(包含在搜索范围内)。
end:指向容器中要搜索的结束位置的一个迭代器,(不包含在搜索范围内)。
element:要查找的特定值。
2.3补充一个辅助使用的函数distance(start,it):
用于计算迭代器间距离的函数。它接受两个迭代器作为参数,并返回它们之间的距离,即两个迭代器之间的元素个数。由于find()函数返回的是指定元素的迭代器,不是该元素的位置下标,所以需要使用distance(start,it)函数计算出该元素到首元素的距离,即为该元素的位置下标。
2.4使用举例:
#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;
int main()
{
vector<int> vec = {5, 9, 3, 5, 7, 1, 8, 6};
// 创建一个名为vec的vector容器,并初始化一些整数
auto end = vec.end();
auto start = vec.begin();
// 创建迭代器end,指向vec容器的末尾
// 创建迭代器start,指向vec容器的开始
auto it = find(start, end, 1);
// 使用std::find函数在指定范围内查找值为1的元素
// start是查找范围的起始位置的迭代器
// end是查找范围的结束位置的迭代器
// 1是要查找的元素的值
int index = distance(start, it);
// 使用std::distance函数计算start迭代器到it迭代器之间的距离
// 即it迭代器所指向的元素在容器中的索引位置
printf("元素1第一次出现的位置为:%d\n", index);
// 打印找到的位置
return 0;
}
//输出:
元素1第一次出现的位置为:5
3.for_each(start,end,func):
3.1函数作用:
用于对容器中的每个元素执行指定的操作。它接受两个参数:一个表示容器的起始迭代器和一个表示容器的结束迭代器。然后,它将为容器中的每个元素调用传入的函数或函数对象,以执行指定的操作。
3.2参数解释:
start:指向容器中要搜索的起始位置的一个迭代器(包含在搜索范围内)。
end:指向容器中要搜索的结束位置的一个迭代器,(不包含在搜索范围内)。
func:要应用于每个元素的函数对象或函数指针。for_each()会遍历[start,end)范围内的每个元素,并对每个元素调用func
函数。
3.3使用举例:
#include <stdio.h>
#include <vector>
using namespace std;
void print(int element)
{
printf("%d ", element);
}
int main()
{
vector<int> vec = {1, 2, 3, 4, 5};
// 创建一个名为vec的vector容器,并初始化一些整数
auto end = vec.end();
auto start = vec.begin();
// 创建迭代器end,指向vec容器的末尾
// 创建迭代器start,指向vec容器的开始
for_each(start, end, print);
// 使用std::for_each函数遍历vec容器中的每个元素
// 将每个元素作为参数传递给自定义的函数print
// start是遍历的起始位置的迭代器
// end是遍历的结束位置的迭代器
return 0;
}
//输出:
1 2 3 4 5
4.max_element(start,end):
4.1函数作用:
用于在给定范围[start,end)内查找容器中的最大元素,并返回指向该最大元素的迭代器。
4.2参数解释:
start:指向容器中要搜索的起始位置的一个迭代器(包含在搜索范围内)。
end:指向容器中要搜索的结束位置的一个迭代器,(不包含在搜索范围内)。
4.3使用举例:
#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;
int main()
{
vector<int> vec = {1, 2, 3, 4, 5};
auto end = vec.end();
auto start = vec.begin();
auto max = max_element(start, end);
printf("最大元素为:%d\n", *max);
return 0;
}
//输出:
最大元素为:5
5.min_element(start,end):
5.1函数作用:
用于在给定范围[start,end)内查找容器中的最大元素,并返回指向该最大元素的迭代器。
5.2参数解释:
start:指向容器中要搜索的起始位置的一个迭代器(包含在搜索范围内)。
end:指向容器中要搜索的结束位置的一个迭代器,(不包含在搜索范围内)。
5.3使用举例:
#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;
int main()
{
vector<int> vec = {1, 2, 3, 4, 5};
auto end = vec.end();
auto start = vec.begin();
auto min = min_element(start, end);
printf("最小元素为:%d\n", *min);
return 0;
}
//输出:
最小元素为:1
6.reverse(start,end):
6.1函数作用:
用于反转容器中元素的顺序(后面的排到前面,前面的排到后面)。它接受两个迭代器参数,表示容器中要反转的范围[start,end)。
6.2参数解释:
start:指向容器中要搜索的起始位置的一个迭代器(包含在搜索范围内)。
end:指向容器中要搜索的结束位置的一个迭代器,(不包含在搜索范围内)。
6.3使用举例:
#include <algorithm> // 包含算法头文件
#include <stdio.h>
#include <vector>
using namespace std;
int main()
{
vector<int> vec = {1, 2, 3, 4, 5}; // 创建一个名为vec的vector容器,并初始化一些整数
auto end = vec.end(); // 创建迭代器end,指向vec容器的末尾
auto start = vec.begin(); // 创建迭代器start,指向vec容器的开始
reverse(start, end); // 使用std::reverse反转vec容器中元素的顺序
printf("反转容器元素顺序后:\n");
for (int i = 0; i < vec.size(); i++) // 通过循环打印反转后的容器元素的值
{
printf("%d ", *(start + i)); // *(start + i)用于访问第i个元素的值
}
return 0;
}
//输出:
反转容器元素顺序后:
5 4 3 2 1