STL的常用算法
概述:
算法主要是由头文件<algorithm> <functional> <numeric> 组成。
<algorithm>是所有STL头文件中最大的一个,涉及比较、交换、查找、遍历等等;
<functional>定义了一些模板类,用于声明函数对象;
<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数。
三、排序算法
算法简介:
sort //对容器内元素进行排序
random_shuffle //洗牌 指定范围内元素随机调整顺序
merge //容器元素合并 并存储到另一容器中
reverse //反转指定范围内容器
1、random_shuffle(iterator beg,iterator end);
指定范围内的元素随机调整次序;算法实用,但使用时注意加随机数种子才能真正的随机打乱
void myPrint(int val)
{
cout << val << " ";
}
void test01()
{
//加入随机数种子,使每次打乱顺序随机
srand((unsigned int)time(NULL));
vector<int>V1;
V1.push_back(10);
V1.push_back(20);
V1.push_back(30);
V1.push_back(40);
V1.push_back(50);
//原顺序
for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint
cout << endl;
//利用洗牌算法打乱顺序
random_shuffle(V1.begin(), V1.end());
//遍历打印输出
for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint
cout << endl;
}
2、merge
两个容器元素合并,并存储到另一容器中
注意两个容器必须是有序的
merge(iterator beg1,iterator end1, iterator beg2,iterator end2,iterator dest);
dest:目标容器迭代器的begin()
void myPrint(int val)
{
cout << val << " ";
}
void test01()
{
//加入随机数种子,使每次打乱顺序随机
srand((unsigned int)time(NULL));
vector<int>V1;
V1.push_back(10);
V1.push_back(20);
V1.push_back(30);
V1.push_back(40);
V1.push_back(50);
//原顺序
for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint
cout << endl;
//利用洗牌算法打乱顺序
random_shuffle(V1.begin(), V1.end());
//遍历打印输出
for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint
cout << endl;
}
3、reverse(iterator beg,iterator end);
将指定范围内的元素反转
四、常用的拷贝和替换算法
copy
replace
replace_if
swap
1、copy(iterator beg,iterator end,iterator dest);
容器指定范围内的元素拷贝到另一容器中。
dest:目标起始迭代器
2、replace(iterator beg,iterator end,oldvalue,newvalue);
将容器内指定区间内旧元素替换成新元素 满足oldvalue的元素都被替换掉
void myPrint(int val)
{
cout << val << " ";
}
class Print {
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test04()
{
vector<int>V1;
V1.push_back(10);
V1.push_back(20);
V1.push_back(30);
V1.push_back(40);
V1.push_back(50);
//遍历 替换前
for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint
cout << endl;
replace(V1.begin(),V1.end(),30,3000);//30替换成3000
for_each(V1.begin(), V1.end(), Print());//仿函数打印 Print()为匿名对象
cout << endl;
}
3、replace_if(iterator beg,iterator end,_pred,newvalue);
//按条件替换元素 满足条件的替换成指定元素
_pred为谓词
class Greater30 {
public:
bool operator()(int val)
{
return val > 30;
}
};
void test05()
{
vector<int>V1;
V1.push_back(10);
V1.push_back(20);
V1.push_back(30);
V1.push_back(40);
V1.push_back(50);
//遍历 替换前
for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint
cout << endl;
replace_if(V1.begin(), V1.end(), Greater30(), 3000);//将大于30的元素替换成3000 Greater30()匿名对象
for_each(V1.begin(), V1.end(), Print());//仿函数打印 Print()为匿名对象
cout << endl;
}
replace_if按条件查找,可以利用仿函数灵活筛选满足的条件
4、swap
互换两个容器的元素
swap(container c1,container c2);
注意容器c1、c2需要满足相同结构类型
void test07()
{
vector<int>V1;
V1.push_back(10);
V1.push_back(20);
V1.push_back(30);
V1.push_back(40);
V1.push_back(50);
vector<int>V2;
V2.push_back(15);
V2.push_back(24);
V2.push_back(37);
V2.push_back(48);
V2.push_back(59);
V2.push_back(69);
V2.push_back(79);
V2.push_back(89);
//遍历 交换前
for_each(V1.begin(), V1.end(), myPrint);//函数打印 myPrint
cout << endl;
swap(V1, V2);//交换
for_each(V1.begin(), V1.end(), Print());//仿函数打印 Print()为匿名对象
cout << endl;
}