算法主要是由头文件 组成。 是所有STL头文件中最大的一个,其中常用的功能涉 及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等…体积很小,只 包括在几个序列容器上进行的简单运算的模板函数. 定义了一些模板类,用以声明 函数对象。
1、常用的遍历算法
1、for_each:遍历容器元素
遍 历 算 法 遍 历 容 器 元 素
@param beg 开 始 迭 代 器
@param end 结 束 迭 代 器
@param _callback 函 数 回 调 或 者 函 数 对 象
@return 函 数 对 象
for_each(iterator beg, iterator end, _callback);
2、transform算法 将指定容器区间元素搬运到另一容器中
注意 :
transform 不会给目标容器分配内存,所以需要我们提前分配好内存
@param beg1 源容器开始迭代器
@param end1 源容器结束迭代器
@param beg2 目标容器开始迭代器
@param _cakkback 回调函数或者函数对象
@return 返回目标容器迭代器
transform(iterator beg1, iterator end1, iterator beg2, _callbakc);
int myTransInt(int val)
{
return val;
}
class MyTransInt{
public:
int operator()(int val)
{
return val;
}
};
void test02()
{
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
//将v1容器的元素 帮运到 v2中
vector<int> v2;
//预先:设置v2的大小(注意!!!)
v2.resize(v1.size());
//transform(v1.begin(),v1.end(),v2.begin(), 搬运方式);
//transform(v1.begin(),v1.end(),v2.begin(),myTransInt);
transform(v1.begin(),v1.end(),v2.begin(),MyTransInt());
for_each(v2.begin(),v2.end(),[](int val){cout<<val<<" ";});
cout<<endl;
}
运行结果:
2、常用的查找算法
2.1、find算法 查找元素
find算 法 查 找 元 素
@param beg 容 器 开 始 迭 代 器
@param end 容 器 结 束 迭 代 器
@param value 查 找 的 元 素
@return 返 回 查 找 元 素 的 位 置
find(iterator beg, iterator end, value)
失败返回v.end()
#include<string>
class Person
{
public:
string name;
int age;
public:
Person(string name,int age)
{
this->name = name;
this->age = age;
}
bool operator==(const Person &ob)
{
if(this->name == ob.name && this->age==ob.age)
return true;
return false;
}
};
void test03()
{
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
vector<int>::iterator ret;
ret = find(v1.begin(),v1.end(),20);
if(ret != v1.end())
{
cout<<"找到的数据为:"<<*ret<<endl;
}
vector<Person> v2;
v2.push_back(Person("德玛西亚",18));
v2.push_back(Person("小法",19));
v2.push_back(Person("小炮",20));
v2.push_back(Person("牛头",21));
Person tmp("小炮",20);
vector<Person>::iterator ret2;
//对于find寻找自定义数据 需要重载==
ret2 = find(v2.begin(),v2.end(),tmp);
if(ret2 != v2.end())
{
cout<<"找到的数据name="<<(*ret2).name<<",age="<<(*ret2).age<<endl;
}
}
运行结果:
2、find_if条件查找
find_if算 法 条 件 查 找
@param beg 容 器 开 始 迭 代 器
@param end 容 器 结 束 迭 代 器
@param callback 回 调 函 数 或 者 谓 词 ( 返 回 bool类 型 的 函 数 对 象 )
@return bool
查 找 返 回 true
否 则 false
find_if(iterator beg, iterator end, _callback);
bool myGreaterThan20(int val)
{
return val>20;
}
class MyGreaterThan20{
public:
bool operator()(int val)
{
return val>20;
}
};
void test04()
{
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
//寻找第一个大于20的数
vector<int>::iterator ret;
//ret = find_if(v1.begin(),v1.end(), myGreaterThan20 );
ret = find_if(v1.begin(),v1.end(), MyGreaterThan20() );
if(ret != v1.end())
{
cout<<"寻找到的数据为:"<<*ret<<endl;
}
}
运行结果:
2.3、adjacent_find算法 查找相邻重复元素
adjacent_find算 法 查 找 相 邻 重 复 元 素
@param beg容 器 开 始 迭 代 器
@param end容 器 结 束 迭 代 器
@param _callback回调函数或者谓词(返回bool类型的函数对象)
@return返回相邻元素的第一个位置的迭代器
adjacent_find(iterator beg, iterator end, _callback);
void test05()
{
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(20);
v1.push_back(40);
v1.push_back(50);
v1.push_back(50);
vector<int>::iterator ret;
//对于普通数据 不需要回调函数
ret = adjacent_find(v1.begin(),v1.end());
if(ret != v1.end())
{
cout<<"寻找到重复的数据:"<<*ret<<endl;
}
vector<Person> v2;
v2.push_back(Person("德玛西亚",18));
v2.push_back(Person("小法",19));
v2.push_back(Person("小法",19));
v2.push_back(Person("牛头",21));
vector<Person>::iterator ret2;
ret2 = adjacent_find(v2.begin(),v2.end());
if(ret2 != v2.end())
{
cout<<"寻找到重复的数据:"<<(*ret2).name<<" "<<(*ret2).age<<endl;
}
}
运行结果:
2.4、binary_search算法 二分查找法(容器必须有序)
binary_search算 法 二 分 查 找 法
注 意 :
在 无 序 序 列 中 不 可 用
@param beg 容 器 开 始 迭 代 器
@param end 容 器 结 束 迭 代 器
@param value 查 找 的 元 素
@return bool 查找到返回 true 否则 false
bool binary_search(iterator beg, iterator end, value);
void test06()
{
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
bool ret = binary_search(v1.begin(),v1.end(),30);
if(ret == true)
{
cout<<"找到"<<endl;//找到
}
else
{
cout<<"未找到"<<endl;
}
}
2.5、count算法 统计元素出现次数
count算 法 统 计 元 素 出 现 次 数
@param beg 容 器 开 始 迭 代 器
@param end 容 器 结 束 迭 代 器
@param value 回 调 函 数 或 者 谓 词 ( 返 回 bool类 型 的 函 数 对 象 )
@return int 返 回 元 素 个 数
count(iterator beg, iterator end, value);
void test07()
{
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(10);
v1.push_back(40);
v1.push_back(10);
cout<<count(v1.begin(),v1.end(),10)<<endl;//3
}
2.6、count_if算法 统计元素出现次数
count_if算 法 统 计 元 素 出 现 次 数
@param beg 容 器 开 始 迭 代 器
@param end 容 器 结 束 迭 代 器
@param callback 回 调 函 数 或 者 谓 词 ( 返 回 bool类 型 的 函 数 对 象 )
@return int返 回 元 素 个 数
count_if(iterator beg, iterator end, _callback);
bool myGreaterThan10(int val)
{
return val>10;
}
class MyGreaterThan10
{
public:
bool operator()(int val)
{
return val>10;
}
};
void test07()
{
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(10);
v1.push_back(40);
v1.push_back(10);
cout<<count(v1.begin(),v1.end(),10)<<endl;//3
//普通函数
cout<<count_if(v1.begin(),v1.end(), myGreaterThan10)<<endl;//2
//函数对象
cout<<count_if(v1.begin(),v1.end(), MyGreaterThan10())<<endl;//2
//内建函数对象
cout<<count_if(v1.begin(),v1.end(), bind2nd(greater<int>(),10))<<endl;//2
}
运行结果:
3、常用排序算法
3.1、merge算法 容器元素合并,并存储到另一容器中(每个容器必须有序)
merge算 法 容 器 元 素 合 并 , 并 存 储 到 另 一 容 器 中
注 意 : 两 个 容 器 必 须 是 有 序 的
@param beg1 容 器 1 开 始 迭 代 器
@param end1 容 器 1 结 束 迭 代 器
@param beg2 容 器 2 开 始 迭 代 器
@param end2 容 器 2 结 束 迭 代 器
@param dest 目 标 容 器 开 始 迭 代 器
merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterat or dest)
void test01()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
vector<int> v2;
v2.push_back(2);
v2.push_back(4);
v2.push_back(6);
v2.push_back(8);
vector<int> v3;
//预先:设置v3的大小
v3.resize(v1.size()+v2.size());
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin());
for_each(v3.begin(),v3.end(),[](int val){cout<<val<<" ";});
cout<<endl;
}
运行结果:
3.2、sort算法 容器元素排序
sort算 法 容 器 元 素 排 序
@param beg 容 器 1 开 始 迭 代 器
@param end 容 器 1 结 束 迭 代 器
@param _callback 回 调 函 数 或 者 谓 词 ( 返 回 bool类 型 的 函 数 对 象 )
sort(iterator beg, iterator end, _callback)
3.3、random_shuffle算法 对指定范围内的元素随机调整次序
random_shuffle算 法 对 指 定 范 围 内 的 元 素 随 机 调 整 次 序
@param beg容 器 开 始 迭 代 器
@param end容 器 结 束 迭 代 器
random_shuffle(iterator beg, iterator end)
#include<time.h>
void test02()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
//srand设置种子
srand(time(NULL));
for_each(v1.begin(),v1.end(),[](int val){cout<<val<<" ";});
cout<<endl;
//需要配置 srand
random_shuffle(v1.begin(),v1.end());
for_each(v1.begin(),v1.end(),[](int val){cout<<val<<" ";});
cout<<endl;
}
运行结果:
3.4、reverse算法 反转指定范围的元素
reverse算 法 反 转 指 定 范 围 的 元 素
@param beg 容 器 开 始 迭 代 器
@param end 容 器 结 束 迭 代 器
reverse(iterator beg, iterator end)
void test03()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
for_each(v1.begin(),v1.end(),[](int val){cout<<val<<" ";});
cout<<endl;//1 3 5 7
reverse(v1.begin(),v1.end());
for_each(v1.begin(),v1.end(),[](int val){cout<<val<<" ";});
cout<<endl;//7 5 3 1
}
4、常用拷贝和替换算法
4.1、copy算法 将容器内指定范围的元素拷贝到另一容器中
copy算 法 将 容 器 内 指 定 范 围 的 元 素 拷 贝 到 另 一 容 器 中
@param beg 容 器 开 始 迭 代 器
@param end 容 器 结 束 迭 代 器
@param dest 目 标 起 始 迭 代 器
copy(iterator beg, iterator end, iterator dest)
#include<iterator>
void test04()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
vector<int> v2;
//预先:设置大小
v2.resize(v1.size());
copy(v1.begin(),v1.end(),v2.begin());
for_each(v2.begin(),v2.end(),[](int val){cout<<val<<" ";});
cout<<endl;//1 3 5 7
//copy秀一下:用copy输出(了解)
copy(v2.begin(),v2.end(), ostream_iterator<int>(cout," ") );
}
运行结果:
4.2、replace算法 将容器内指定范围的旧元素修改为新元素
replace算 法 将 容 器 内 指 定 范 围 的 旧 元 素 修 改 为 新 元 素
@param beg 容 器 开 始 迭 代 器
@param end 容 器 结 束 迭 代 器
@param oldvalue 旧 元 素
@param oldvalue 新 元 素
replace(iterator beg, iterator end, oldvalue, newvalue)
4.3、replace_if算法 将容器内指定范围满足条件的元素替换为新元素
replace_if算 法 将 容 器 内 指 定 范 围 满 足 条 件 的 元 素 替 换 为 新 元 素
@param beg容 器 开 始 迭 代 器
@param end容 器 结 束 迭 代 器
@param callback 函 数 回 调 或 者 谓 词 ( 返 回 Bool类 型 的 函 数 对 象 )
@param oldvalue新 元 素
replace_if(iterator beg, iterator end, _callback, newvalue)
void test05()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
//将容器中的3替换成3000
replace(v1.begin(),v1.end(),3,3000);
copy(v1.begin(),v1.end(), ostream_iterator<int>(cout," ") );
cout<<endl;
vector<int> v2;
v2.push_back(1);
v2.push_back(3);
v2.push_back(5);
v2.push_back(7);
//将容器的大于3替换成3000
replace_if(v2.begin(),v2.end(), bind2nd(greater<int>(),3) , 1000 );
copy(v2.begin(),v2.end(), ostream_iterator<int>(cout," ") );
cout<<endl;
}
运行结果:
4.4、swap算法 互换两个容器的元素
swap算 法 互 换 两 个 容 器 的 元 素
@param c1 容 器 1
@param c2 容 器 2
swap(container c1, container c2)
5、算术生成算法
5.1、accumulate算法 计算容器元素累计总和
accumulate算 法 计 算 容 器 元 素 累 计 总 和
@param beg容 器 开 始 迭 代 器
@param end容 器 结 束 迭 代 器
@param value 累 加 值
accumulate(iterator beg, iterator end, value)
void test06()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
int sum = accumulate(v1.begin(),v1.end(),1000);
cout<<"sum = "<<sum<<endl;//1016
}
5.2、fill算法 向容器中添加元素
fill算 法 向 容 器 中 添 加 元 素
@param beg 容 器 开 始 迭 代 器
@param end 容 器 结 束 迭 代 器
@param value t 填 充 元 素
fill(iterator beg, iterator end, value)
#include<iterator>
#include<vector>
#include<algorithm>
void test07()
{
vector<int> v;
v.resize(5);
fill(v.begin(),v.end(),50);
for_each(v.begin(),v.end(),[](int vel){cout<<vel<<" ";});
cout<<endl;
}
6、常用集合算法
6.1、set_intersection算法 求两个set集合的交集
set_intersection算法 求两个set集合的交集
注意:两个集合必须是有序序列
@param beg1 容器1开始迭代器
@param end1 容器1结束迭代器
@param beg2 容器2开始迭代器
@param end2 容器2结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址
set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)
6.2、set_intersection算法 求两个set集合的交集
set_union算法 求两个set集合的并集
注意:两个集合必须是有序序列
@param beg1 容器1开始迭代器
@param end1 容器1结束迭代器
@param beg2 容器2开始迭代器
@param end2 容器2结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址
set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)
6.3、set_difference算法 求两个set集合的差集
set_difference算法 求两个set集合的差集
注意:两个集合必须是有序序列
@param beg1 容器1开始迭代器
@param end1 容器1结束迭代器
@param beg2 容器2开始迭代器
@param end2 容器2结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址
set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)
void test08()
{
vector<int> A;
A.push_back(1);
A.push_back(3);
A.push_back(5);
A.push_back(7);
A.push_back(9);
vector<int> B;
B.push_back(7);
B.push_back(9);
B.push_back(2);
B.push_back(4);
B.push_back(6);
//求交集
vector<int> v1;//存放交集
v1.resize(min(A.size(),B.size()));
vector<int>::iterator myEnd= set_intersection(A.begin(),A.end(),B.begin(),B.end(), v1.begin());
copy(v1.begin(), myEnd, ostream_iterator<int>(cout," ") );
cout<<endl;
//求并集
vector<int> v2;//存放并集
v2.resize(A.size()+B.size() );
myEnd = set_union(A.begin(),A.end(),B.begin(),B.end(), v2.begin());
copy(v2.begin(), myEnd, ostream_iterator<int>(cout," ") );
cout<<endl;
//求差集 A 差 B
vector<int> v3;//存放并集
v3.resize( A.size() );
myEnd = set_difference(A.begin(),A.end(),B.begin(),B.end(), v3.begin());
copy(v3.begin(), myEnd, ostream_iterator<int>(cout," ") );
cout<<endl;
}
运行结果: