算法主要由头文件
、
、<numeric>
组成。
①
是所以STL头文件中最大的一个,范围涉及比较、交换、查找、便利操作、复制、修改等。
②
体积很小,只包括几个序列上面进行简单数学计算的函数模板。
③<numeric>
定义了一些模板类,用于声明函数对象。
①for_each
函数原型
for_each(iterator beg,iterator end,_func);
beg:开始迭代器
end:结束迭代器
_func:函数对象或函数
②transform
功能描述:搬运容器到另一个容器中。
函数原型
transform(iterator beg1,iterator end1,iterator beg2,_func);
beg1:源容器开始迭代器
end1:源容器结束迭代器
beg2:目标容器开始迭代器
_func:函数或者函数对象
①find
功能描述:查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end();
函数原型:
find(iterator beg,iterator end,value);
beg:开始迭代器
end:结束迭代器
value:查找的元素
当查找自定义数据类型时,需要重载==号,让底层find知道如何对比person数据类型
eg:
class person
{
public:
person(string name, int age) {
this->name = name;
this->age = age;
}
//重载==
bool operator==(const person& p) {
if (this->name == p.name && this->age == p.age) {
return true;
}
else {
return false;
}
}
string name;
int age;
};
void test()
{
vector<person> a;
person p1("小红", 12);
person p2("小明", 13);
person p3("小东", 10);
person p4("小东", 10);
a.push_back(p1);
a.push_back(p2);
a.push_back(p3);
vector<person>::iterator it = find(a.begin(), a.end(), p4);
if (it == a.end()) {
cout << "未找到" << endl;
}
else {
cout << "找到了" << endl;
}
}
②find_if
功能描述:按条件查找元素
函数原型:
find_if(iterator beg,iterator end,_Pred);
beg开始迭代器
end结束迭代器
_Pred函数或者谓词(返回bool类型的仿函数)
自定义数据类型
class person
{
public:
person(string name, int age) {
this->name = name;
this->age = age;
}
string name;
int age;
};
class my_compare
{
public:
bool operator()(person& p) {
return p.age > 15;
}
};
void test()
{
vector<person> a;
person p1("小红", 12);
person p2("小明", 16);
person p3("小东", 17);
a.push_back(p1);
a.push_back(p2);
a.push_back(p3);
//找到一个年龄>15岁的
vector<person>::iterator it= find_if(a.begin(), a.end(), my_compare());
while (it != a.end()) {
cout << "姓名:" << (*it).name << "年龄:" << (*it).age << endl;
it++;
}
}
③adjacent_find
功能描述:查找相邻重复元素
注意:在无序序列中不可用
函数原型:
adjacent_find(iterator beg,iterator end);
beg开始迭代器
end结束迭代器
返回值:查到相邻元素,返回相邻元素的第一个位置的迭代器
④binary_search
功能描述:查找指定元素是否存在
函数原型:
bool binary_search(iterator beg,iterator end,value);
beg开始迭代器
end结束迭代器
value查找的元素
返回值:查到返回true,否则false;
⑤count
功能描述:统计元素个数
函数原型:
count(iterator beg,iterator end,value);
beg开始迭代器
end结束迭代器
value统计的元素
统计自定义数据类型:
class person
{
public:
person(string name, int age) {
this->name = name;
this->age = age;
}
//重载==号
bool operator==(const person &p) {
if (p.age == this->age) {
return true;
}
else {
return false;
}
}
string name;
int age;
};
void test()
{
vector<person> a;
person p1("小红", 16);
person p2("小明", 16);
person p3("小东", 17);
person p4("小花", 19);
person p5("小6", 19);
a.push_back(p1);
a.push_back(p2);
a.push_back(p3);
a.push_back(p4);
int ret = count(a.begin(), a.end(), p5);
cout << ret << endl;
}
⑥count_if
功能描述:按条件统计元素个数
函数原型:
count_if(iterator beg,iterator end,_Pred);
beg开始迭代器
ned结束迭代器
_Pred谓词
自定义数据类型:
class person
{
public:
person(string name, int age) {
this->name = name;
this->age = age;
}
string name;
int age;
};
class my_compare
{
public:
bool operator()(const person &p1) {
return p1.age > 15;
}
};
void test()
{
vector<person> a;
person p1("小红", 16);
person p2("小明", 16);
person p3("小东", 17);
person p4("小明", 16);
a.push_back(p1);
a.push_back(p2);
a.push_back(p3);
a.push_back(p4);
int ret=count_if(a.begin(), a.end(), my_compare());
cout << ret << endl;
}
①sort
功能介绍:对容器内元素进行排序(默认从小到大)
函数原型:
sort(iterator beg,iterator end,_Pred);
beg开始迭代器
end结束迭代器
_Pred谓词
返回值:按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置。
②random_shuffle
功能介绍:指定范围内的元素随机调整次序
函数原型:
random_shuffle(iterator beg,iterator end);
beg开始迭代器
end结束迭代器
③merge
功能介绍:容器元素合并,并存储到另一容器中
注意:两个容器都必须是有序的。
函数原型:
merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
beg1 容器1开始迭代器
end1 容器1结束迭代器
beg2 容器2开始迭代器
end2 容器2结束迭代器
dest 目标容器开始迭代器
④reverse
功能介绍:将容器内元素进行反转
函数原型:
reverse(iterator beg,iterator end);
beg 开始迭代器
end 结束迭代器
①copy
功能介绍:容器内指定范围的元素拷贝到另一容器中
注意:目标容器需要提前开辟空间
函数原型:
copy(iterator beg,iterator end,iterator dest);
②replace
功能介绍:将容器内指定范围的旧元素修改为新元素
函数原型:
replace(iterator beg,iterator end,oldvalue,newvalue);
beg 开始迭代器
end 结束迭代器
oldvalue 旧元素
newvalue 新元素
③replace_if
功能介绍:按条件替换元素,满足条件的替换成指定元素
函数原型:
beg 开始迭代器
end 结束迭代器
_pred 谓词
newvalur 替换的元素
④swap
功能介绍:互换两个容器的元素
函数原型:
swap(container c1,container c2);
c1:容器1
c2:容器2
算术生产算法属于小型算法,使用时包含的头文件为<numeric>
①accumulate
功能介绍:计算容器元素累计总和
函数原型:
accmulate(iterator beg,iterator end,value);
beg 开始迭代器
end 结束迭代器
value 起始值
②fill
功能介绍:向容器中添加元素
函数原型:
fill(iterator beg,iterator end,value)
beg 开始迭代器
end 结束迭代器
value 填充的值
两个集合必须都是有序序列
①set_intersection
功能介绍:求两个容器的交集
需要为目标容器开辟空间,最特殊情况:大容器包含小容器
vector<int>a;
vector<int>b;
vector<int>Target;
Target.resize(min(a.size(),b.size()); //min是寻找小容器
函数原型:
set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
beg1 容器1开始迭代器
end1 容器1结束迭代器
beg2 容器2开始迭代器
end2 容器2结束迭代器
dest 目标容器开始迭代器
返回值:交集中最后一个元素的位置
②set_union
功能介绍:求两个容器的并集
需要为目标容器开辟空间,最特殊情况:两个容器没有交集
vector<int>a;
vector<int>b;
vector<int>Target;
Target.resize(a.size()+b.size());
函数原型:
set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
beg1 容器1开始迭代器
end1 容器1结束迭代器
beg2 容器2开始迭代器
end2 容器2结束迭代器
dest 目标容器开始迭代器
③set_difference
功能介绍:求两个容器的差集
需要为目标容器开辟空间,最特殊情况:两个容器没有交集,取两个容器中大的size作为目标容器开辟的空间
vector<int>a;
vector<int>b;
vector<int>Target;
Target.resize(max(a.size(),b.size()); //max是寻找大容器
函数原型:
set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
beg1 容器1开始迭代器
end1 容器1结束迭代器
beg2 容器2开始迭代器
end2 容器2结束迭代器
dest 目标容器开始迭代器