开篇先附上STL-常用算法(一)的链接
STL-常用算法(一.遍历 查找 排序)_小梁今天敲代码了吗的博客-CSDN博客
目录
常用拷贝和替换算法:
copy函数示例:(将v1容器中的元素复制给v2)
replace函数示例:(将容器中的20 替换成 100)
replace_if函数示例:(将容器中大于等于的30 替换成 300)
swap函数示例:(交换v1和v2容器之间的元素)
常用算术生成算法
accumulate函数示例:(在起始值是100的基础上加上1-10之和)
fill函数示例:(在vector容器中填充10个1)
常用集合算法
set_intersection函数示例:(求0-9的集合和5-14的集合的交集)
set_union函数示例:(求0-9的集合和5-14的集合的并集)
set_difference函数示例:(求0-9的集合和5-14的集合的差集)
总结:
常用拷贝和替换算法:
copy(iterator beg, iterator end, iterator dest)
// 容器内指定范围的元素拷贝到另一容器中
replace(iterator beg, iterator end, oldvalue, newvalue)
// 将容器内指定范围的旧元素修改为新元素
replace_if(iterator beg, iterator end, _pred, newvalue)
// 容器内指定范围满足条件的元素替换为新元素
swap(container c1, container c2)
// 互换两个容器的元素
copy函数示例:(将v1容器中的元素复制给v2)
#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
class myPrint
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v1;
for (int i = 0; i < 10; i++) {
v1.push_back(i + 1);
}
vector<int> v2;
v2.resize(v1.size());
copy(v1.begin(), v1.end(), v2.begin());
for_each(v2.begin(), v2.end(), myPrint());
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
运行结果:
replace函数示例:(将容器中的20 替换成 100)
class myPrint
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v;
v.push_back(20);
v.push_back(30);
v.push_back(20);
v.push_back(40);
v.push_back(50);
v.push_back(10);
v.push_back(20);
cout << "替换前:" << endl;
for_each(v.begin(), v.end(), myPrint());
cout << endl;
//将容器中的20 替换成 100
cout << "替换后:" << endl;
replace(v.begin(), v.end(), 20, 100);
for_each(v.begin(), v.end(), myPrint());
cout << endl;
}
运行结果:
replace_if函数示例:(将容器中大于等于的30 替换成 300)
class myPrint
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
class ReplaceGreater30
{
public:
bool operator()(int val)
{
return val >= 30;
}
};
void test01()
{
vector<int> v;
v.push_back(20);
v.push_back(30);
v.push_back(20);
v.push_back(40);
v.push_back(50);
v.push_back(10);
v.push_back(20);
cout << "替换前:" << endl;
for_each(v.begin(), v.end(), myPrint());
cout << endl;
//将容器中大于等于的30 替换成 300
cout << "替换后:" << endl;
replace_if(v.begin(), v.end(), ReplaceGreater30(), 300);
for_each(v.begin(), v.end(), myPrint());
cout << endl;
}
运行结果:
swap函数示例:(交换v1和v2容器之间的元素)
class myPrint
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i + 100);
}
cout << "交换前: " << endl;
for_each(v1.begin(), v1.end(), myPrint());
cout << endl;
for_each(v2.begin(), v2.end(), myPrint());
cout << endl;
cout << "交换后: " << endl;
swap(v1, v2);
for_each(v1.begin(), v1.end(), myPrint());
cout << endl;
for_each(v2.begin(), v2.end(), myPrint());
cout << endl;
}
运行结果:
常用算术生成算法
accumulate(iterator beg, iterator end, value) // 计算容器元素累计总和
fill(iterator beg, iterator end, value) // 向容器中添加元素
accumulate函数示例:(在起始值是100的基础上加上1-10之和)
void test01()
{
vector<int> v;
for (int i = 0; i <= 10; i++) {
v.push_back(i);
}
int total = accumulate(v.begin(), v.end(), 100);//起始值是100
cout << "total = " << total << endl;
}
运行结果:
fill函数示例:(在vector容器中填充10个1)
class myPrint
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v;
v.resize(10);
//填充10个1
fill(v.begin(), v.end(), 1);
for_each(v.begin(), v.end(), myPrint());
cout << endl;
}
运行结果:
常用集合算法
set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest) // 求两个容器的交集
set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest) // 求两个容器的并集
set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest) // 求两个容器的差集
set_intersection函数示例:(求0-9的集合和5-14的集合的交集)
class myPrint
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
v2.push_back(i + 5);
}
vector<int> vTarget;
//取两个里面较小的值给目标容器开辟空间
vTarget.resize(min(v1.size(), v2.size()));
//返回目标容器的最后一个元素的迭代器地址
vector<int>::iterator itEnd =
set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, myPrint());
cout << endl;
}
运行结果:
set_union函数示例:(求0-9的集合和5-14的集合的并集)
class myPrint
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i + 5);
}
vector<int> vTarget;
//取两个容器的和给目标容器开辟空间
vTarget.resize(v1.size() + v2.size());
//返回目标容器的最后一个元素的迭代器地址
vector<int>::iterator itEnd =
set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, myPrint());
cout << endl;
}
运行结果:
set_difference函数示例:(求0-9的集合和5-14的集合的差集)
class myPrint
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test01()
{
vector<int> v1;
vector<int> v2;
for (int i = 0; i < 10; i++) {
v1.push_back(i);
v2.push_back(i + 5);
}
vector<int> vTarget;
//取两个里面较大的值给目标容器开辟空间
vTarget.resize(max(v1.size(), v2.size()));
//返回目标容器的最后一个元素的迭代器地址
cout << "v1与v2的差集为: " << endl;
vector<int>::iterator itEnd =
set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, myPrint());
cout << endl;
cout << "v2与v1的差集为: " << endl;
itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());
for_each(vTarget.begin(), itEnd, myPrint());
cout << endl;
}
运行结果:
总结:
本文总结了STL中剩下的常见算法(拷贝和替换算法,算术生成算法,集合算法)。
所有的 STL 算法归根到底,都可以分为两类。
所谓“质变算法”是指作用在由迭代器[first,last]所标示出来的区间,上运算过程中会更改区间内的元素内容:比如拷贝(copy)、互换(swap)、替换(replace)、填写(fill)、删除(remove)、排列组合(permutation)、分割(partition)。随机重排(random shuffling)、排序(sort)等算法,都属于这一类。
而非质变算法是指在运算过程中不会更改区间内的元素内容。比如查找(find),匹配(search)、计数(count)、遍历(for_each)、比较(equal_mismatch)、寻找极值(max,min)等算法。
使用STL算法的好处如下:
1.易于使用:STL算法提供了一系列的标准库函数,可以对数据结构进行排序,查找,删除,插入等操作。这些函数使用简单方便,用起来非常容易。
2.提高效率:实现算法时,STL的某些算法利用了底层的优化技术,可以帮助开发者提高程序的执行效率。
3.可移植性:STL算法是标准化的,可以在不同的操作系统上使用,使程序具有更好的可移植性。
4.代码复用:STL算法提供了很多函数,可以大大减少代码编写的工作量,提高代码复用率,同时也有助于代码的模块化和可维护性。
5.可扩展性:STL算法提供了一种模板化的方式,使得开发者可以根据需求自定义数据类型和函数。这种方式可以使代码更加灵活和具有扩展性。
总之,STL算法可以使程序更加简洁,高效,可维护,具有更好的可移植性和可扩展性。