STL常用算法合集
一、常用拷贝和替换算法
copy:把指定范围内容器的数据拷贝到另一容器上
replace:更改容器内指定范围的元素
replace_if:更改容器内指定范围且满足条件的元素
swap:交换两容器内的元素
一、copy
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void Print(int val)
{
cout << val << " ";
}
void test01()
{
vector<int>v1;
for (int i = 0; i < 10; i++)
v1.push_back(i);
vector<int>v2;
v2.resize(v1.size());
copy(v1.begin(), v1.end(), v2.begin());
for_each(v2.begin(), v2.end(), Print);
cout << endl;
}
提供一块区间数据的迭代器,和一块存储空间的起点迭代器,将数据拷贝其中,注意实现开辟足够空间
二、replace
void test02()
{
vector<int>v;
for (int i = 0; i < 7; i++)
v.push_back(i);
v.push_back(3);
v.push_back(3);
cout << "替换前:" << endl;
for_each(v.begin(), v.end(), Print);
cout << endl;
replace(v.begin(), v.end(), 3, 7);
cout << "替换后" << endl;
for_each(v.begin(), v.end(), Print);
cout << endl;
}
匹配相同数据进行替换
三、replace_if
class cmp
{
public:
bool operator()(int val)
{
return val > 3;
}
};
void test03()
{
vector<int>v;
for (int i = 0; i < 7; i++)
v.push_back(i);
cout << "替换前:" << endl;
for_each(v.begin(), v.end(), Print);
cout << endl;
replace_if(v.begin(), v.end(), cmp(), 666);
cout << "替换后:" << endl;
for_each(v.begin(), v.end(), Print);
cout << endl;
}
条件匹配,使用仿函数,满足条件的将被替换为目的数据
四、swap
void test04()
{
vector<int>v1;
vector<int>v2;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
v2.push_back(i*i);
}
cout << "交换前:" << endl;
cout << "v1:";
for_each(v1.begin(), v1.end(), Print);
cout << endl;
cout << endl << "v2:" << endl;
for_each(v2.begin(), v2.end(), Print);
cout << endl;
v1.swap(v2);
cout << "交换后:" << endl;
cout << "v1:" << endl;
for_each(v1.begin(), v1.end(), Print);
cout << endl;
cout << "v2:" << endl;
for_each(v2.begin(), v2.end(), Print);
}
这是算法库的swap交换函数,通常可以直接调用std:swap()
完成交换
结果展示:
二、常用算数生成算法
accumulate:计算容器元素累计总和
fill:向容器中添加元素
一、accumulate
#include<algorithm>
#include<numeric>
#include<iostream>
#include<vector>
using namespace std;
void Print(int val)
{
cout << val << " ";
}
void test01()
{
vector<int>v;
for (int i = 0; i <= 100; i++)
v.push_back(i);
int total=accumulate(v.begin(), v.end(), 0);
cout << "total=" << total << endl;
}
注意包含头文件<numeric>
,作用是求和,最后一个参数可赋初始累加值
二、fill
void test02()
{
vector<int>v;
v.resize(10);
fill(v.begin(), v.end(), 100);
for_each(v.begin(), v.end(), Print);
cout << endl;
}
fill填充函数,给区间内的空间都赋上第三个参数的目标值
三、常用集合算法
set_intersection:求两个容器的交集
set_union:求两个容器的并集
set_difference:求两个容器的差集
集合关系
一、set_intersection
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void Print(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()));
auto end = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), end, Print);
cout << endl;
}
交集空间的大小不大于两集合空间的最小值,要预先开辟空间,min是<algorithm>
的库函数
set_intersection的返回值即是最后一个交集数据的迭代器,这里不用vTarget.end()
。
因为除一集合本身为交集的情况外,空间都会剩余,会打印多余的0,因此用其返回值可避免此问题。此外,求交集的两个集合序列必须有序必须有序
二、set_union
void test02()
{
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());
auto end=set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
for_each(vTarget.begin(), end,Print);
cout << endl;
}
考虑可能没有任何交集的情况,存储并集的容器空间大小应为两集合空间大小的和。以保证空间足够大。
三、set_difference
A与B的差集为A所具备但B没有的元素,B与A的差集反之即可。
void test03()
{
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());
auto end = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
cout << "v1与v2的差集:" << endl;
for_each(vTarget.begin(), end, Print);
cout << endl;
vTarget.clear();
vTarget.resize(v2.size());
end = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());
cout << "v2与v1的差集:" << endl;
for_each(vTarget.begin(), end, Print);
cout << endl;
}
开辟空间大小即求差集的第一个集合的空间大小