组成是所有STL头文件最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等体积很小,只包括几个在序列上面进行简单数学运算的模板函数定义了一些模板类,用以声明函数对象for_each 遍历容器for_each(iterator beg, iterator end, _func);
#include
#include
#include
using namespace std;
void print(int val)
{
std::cout << val << " ";
}
class Print
{
public:
void operator()(int val) const
{
std::cout << val << " ";
}
};
int main()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for_each(v.begin(), v.end(), print);
std::cout << std::endl;
for_each(v.begin(), v.end(), Print());
}

transfrom 搬运容器到另一个容器中transfrom(iterator beg1, iterator end1, iterator beg2, _func);
#include
#include
#include
using namespace std;
class Transfrom
{
public:
int operator()(int val)
{
return val * 3;
}
};
class Print
{
public:
void operator()(int val) const
{
std::cout << val << " ";
}
};
int main()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
std::cout << "调用transform前的原verctor:" << std::endl;
for_each(v.begin(), v.end(), Print());
std::cout << std::endl;
vector<int> v2;
v2.resize(v.size());
transform(v.begin(), v.end(), v2.begin(), Transfrom());
std::cout << "调用transform后的原verctor2:" << std::endl;
for_each(v2.begin(), v2.end(), Print());
std::cout << std::endl;
}

find 查找元素end()find(iterator beg, iterator end, value);
案例一:查找内置数据类型
vector<int> vt;
for (int i = 0; i < 10; i++)
{
vt.push_back(i);
}
vector<int>::iterator it = find(vt.begin(), vt.end(), 3);
if (it == vt.end())
{
std::cout << "not find!" << std::endl;
}
else
{
std::cout << "find result" << std::endl;
}
案例二:查找自定义数据类型
class Demo
{
public:
string name;
public:
Demo(string name)
{
this->name = name;
}
bool operator== (const Demo& d1)
{
return this->name == d1.name;
}
};
void findCustomDemo()
{
vector<Demo> vt;
for (int i = 0; i < 10; i++)
{
Demo demo(i+"");
vt.push_back(demo);
}
Demo demo2(1 + "");
vector<Demo>::iterator it = find(vt.begin(), vt.end(), demo2);
if (it == vt.end())
{
std::cout << "not find!" << std::endl;
}
else
{
std::cout << "find result" << std::endl;
}
}
查找自定义数据类型需要重载操作符 ==
find_if 按条件查找元素find_if(iterator beg, iterator end, _Pred);
案例一:查找内置数据类型
class FindFive
{
public:
bool operator()(int val)
{
return val == 5;
}
};
void findDemo()
{
vector<int> vt;
for (int i = 0; i < 10; i++)
{
vt.push_back(i);
}
vector<int>::iterator it = find_if(vt.begin(), vt.end(), FindFive());
if (it == vt.end())
{
std::cout << "not find!" << std::endl;
}
else
{
std::cout << "find result" << std::endl;
}
}
案例二:查找自定义数据类型
class Demo
{
public:
string name;
public:
Demo(string name)
{
this->name = name;
}
};
class Find
{
public:
bool operator()(Demo d)
{
return d.name == "1";
}
};
void findCustomDemo()
{
vector<Demo> vt;
for (int i = 0; i < 10; i++)
{
Demo demo(i+"");
vt.push_back(demo);
}
Demo demo2(1 + "");
vector<Demo>::iterator it = find_if(vt.begin(), vt.end(), Find());
if (it == vt.end())
{
std::cout << "not find!" << std::endl;
}
else
{
std::cout << "find result" << std::endl;
}
}
adjacent_find 查找相邻重复元素iterator adjacent_find(iterator beg, iterator end);
int main()
{
vector<int> vt;
vt.push_back(1);
vt.push_back(2);
vt.push_back(3);
vt.push_back(3);
vt.push_back(1);
vt.push_back(5);
vector<int>::iterator it = adjacent_find(vt.begin(), vt.end());
if (it == vt.end())
{
std::cout << "未找到相邻重复元素" << std::endl;
}
else
{
std::cout << "找到了相邻重复元素" << std::endl;
for (; it != vt.end(); it++)
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
}
binary_search 二分查找法bool binary_search(iterator beg, iterator end, value);
int main()
{
vector<int> vt;
vt.push_back(1);
vt.push_back(2);
vt.push_back(3);
vt.push_back(4);
vt.push_back(5);
vt.push_back(6);
bool isFind = binary_search(vt.begin(), vt.end(), 3);
if (!isFind)
{
std::cout << "未找到指定元素" << std::endl;
}
else
{
std::cout << "找到了指定元素" << std::endl;
}
}
查找元素无序可能会查找不到值信息
count 统计元素个数count(iterator beg, iterator end, value);
int main()
{
vector<int> vt;
vt.push_back(1);
vt.push_back(2);
vt.push_back(3);
vt.push_back(4);
vt.push_back(5);
vt.push_back(3);
int num_count = count(vt.begin(), vt.end(), 3);
std::cout << "元素3共有 " << num_count << " 个" << std::endl;
}
count_if 按条件统计元素个数count_if(iterator beg, iterator end, _Pred);
class CountFive
{
public:
bool operator()(int val)
{
return val == 5;
}
};
int main()
{
vector<int> vt;
vt.push_back(1);
vt.push_back(2);
vt.push_back(3);
vt.push_back(4);
vt.push_back(5);
vt.push_back(3);
int num_count = count_if(vt.begin(), vt.end(), CountFive());
std::cout << "元素5共有 " << num_count << " 个" << std::endl;
}
sort 对元素内内容进行排序sort(iterator beg, iterator end, _Pred);
void print(const vector<int>& vt)
{
for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
int main()
{
srand((unsigned int)time(NULL));
vector<int> vt;
for (int i = 0; i < 10; i++)
{
vt.push_back(rand() % 60 + 40);
}
std::cout << "排序前:" << std::endl;
print(vt);
sort(vt.begin(), vt.end());
std::cout << "排序后:" << std::endl;
print(vt);
sort(vt.begin(), vt.end(), greater<>());
std::cout << "降序排序后:" << std::endl;
print(vt);
}
random_shuffle 洗牌 指定范围内的元素随机调整次序random_shuffle(iterator beg, iterator end);
void print(const vector<int>& vt)
{
for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
int main()
{
vector<int> vt;
for (int i = 0; i < 10; i++)
{
vt.push_back(i);
}
std::cout << "排序前:" << std::endl;
print(vt);
random_shuffle(vt.begin(), vt.end());
std::cout << "打乱顺序后:" << std::endl;
print(vt);
}
为了让每次打乱的顺序更加的真实,需要加入随机数种子:
srand((unsigned int)time(NULL));
merge 容器元素合并,并存储到另一个容器中merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
void print(const vector<int>& vt)
{
for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
int main()
{
srand((unsigned int)time(NULL));
vector<int> vt;
vector<int> vt2;
for (int i = 0; i < 10; i++)
{
vt.push_back(rand() % 60 + 40);
vt2.push_back(rand() % 60 + 40);
}
sort(vt.begin(), vt.end());
sort(vt2.begin(), vt2.end());
std::cout << "合并前:" << std::endl;
print(vt);
print(vt2);
vector<int> vt3;
vt3.resize(vt.size() + vt2.size());
merge(vt.begin(), vt.end(), vt2.begin(), vt2.end(), vt3.begin());
std::cout << "合并后:" << std::endl;
print(vt3);
}

reverse 反转指定范围的元素reverse(iterator beg, iterator end);
void print(const vector<int>& vt)
{
for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
int main()
{
srand((unsigned int)time(NULL));
vector<int> vt;
for (int i = 0; i < 10; i++)
{
vt.push_back(rand() % 60 + 40);
}
sort(vt.begin(), vt.end());
std::cout << "反转前:" << std::endl;
print(vt);
reverse(vt.begin(), vt.end());
std::cout << "反转后:" << std::endl;
print(vt);
}

copy 容器内指定范围的元素拷贝到另一个容器中copy(iterator beg, iterator end, iterator dest);
void print(const vector<int>& vt)
{
for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
int main()
{
srand((unsigned int)time(NULL));
vector<int> vt;
for (int i = 0; i < 10; i++)
{
vt.push_back(rand() % 60 + 40);
}
sort(vt.begin(), vt.end());
std::cout << "copy前:" << std::endl;
print(vt);
vector<int> vt2;
vt2.resize(vt.size());
copy(vt.begin(), vt.end(), vt2.begin());
std::cout << "copy后:" << std::endl;
print(vt2);
}
replace 将容器内指定范围的旧元素修改为新元素replace(iterator beg, iterator end, oldvalue, newvalue);
void print(const vector<int>& vt)
{
for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
int main()
{
vector<int> vt;
for (int i = 0; i < 10; i++)
{
vt.push_back(i);
}
sort(vt.begin(), vt.end());
std::cout << "替换元素前:" << std::endl;
print(vt);
//3替换为10
replace(vt.begin(), vt.end(), 3, 10);
std::cout << "替换元素后:" << std::endl;
print(vt);
}

replace_if 容器内指定范围满足条件的元素替换为新元素replace_if(iterator beg, iterator end, _Pred, newvalue);
void print(const vector<int>& vt)
{
for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
class LessEqual3
{
public:
bool operator()(int val)
{
return val <= 3;
}
};
int main()
{
vector<int> vt;
for (int i = 0; i < 10; i++)
{
vt.push_back(i);
}
sort(vt.begin(), vt.end());
std::cout << "替换元素前:" << std::endl;
print(vt);
//小于等于3的元素替换为10
replace_if(vt.begin(), vt.end(), LessEqual3(), 10);
std::cout << "替换元素后:" << std::endl;
print(vt);
}

swap 互换两个容器中的元素swap(container c1, container c2);
void print(const vector<int>& vt)
{
for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
int main()
{
vector<int> vt;
vector<int> vt2;
for (int i = 0; i < 10; i++)
{
vt.push_back(i);
vt2.push_back(10 + i);
}
sort(vt.begin(), vt.end());
std::cout << "交换容器元素前:" << std::endl;
print(vt);
print(vt2);
swap(vt, vt2);
std::cout << "交换容器元素后:" << std::endl;
print(vt);
print(vt2);
}

两个交换的容器必须要同一种类型
算数生成算法属于小型算法,使用时包含的头文件 #include
accumulate 计算容器元素累计总和accumulate(iterator beg, iterator end, value);
void print(const vector<int>& vt)
{
for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
int main()
{
vector<int> vt;
for (int i = 0; i < 10; i++)
{
vt.push_back(i);
}
std::cout << "容器所有值信息:" << std::endl;
print(vt);
std::cout << "容器所有值之和等于:" << accumulate(vt.begin(), vt.end(), 0) << std::endl;
}

fill 向容器中填充元素fill(iterator beg, iterator end, value);
void print(const vector<int>& vt)
{
for (vector<int>::const_iterator it = vt.begin(); it != vt.end(); it++)
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
int main()
{
vector<int> vt;
for (int i = 0; i < 10; i++)
{
vt.push_back(i);
}
std::cout << "容器所有值信息:" << std::endl;
print(vt);
fill(vt.begin(), vt.end(), 3);
std::cout << "填充容器所有值为3后:" << std::endl;
print(vt);
}

set_intersection 求两个容器的交集set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
void Myprintf(int val)
{
std::cout << val << " ";
}
int main()
{
vector<int> vt;
vector<int> vt2;
for (int i = 0; i < 10; i++)
{
vt.push_back(i);
vt2.push_back(i+1);
}
std::cout << "容器所有值信息:" << std::endl;
for_each(vt.begin(), vt.end(), Myprintf);
std::cout << std::endl;
for_each(vt2.begin(), vt2.end(), Myprintf);
std::cout << std::endl;
vector<int> vt3;
vt3.resize(min(vt.size(), vt2.size()));
vector<int>::iterator it_end = set_intersection(vt.begin(), vt.end(), vt2.begin(), vt2.end(), vt3.begin());
std::cout << "两个容器的交集为:" << std::endl;
for_each(vt3.begin(), it_end, Myprintf);
std::cout << std::endl;
}

set_union 求两个容器的并集set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
void Myprintf(int val)
{
std::cout << val << " ";
}
int main()
{
vector<int> vt;
vector<int> vt2;
for (int i = 0; i < 10; i++)
{
vt.push_back(i);
vt2.push_back(i+1);
}
std::cout << "容器所有值信息:" << std::endl;
for_each(vt.begin(), vt.end(), Myprintf);
std::cout << std::endl;
for_each(vt2.begin(), vt2.end(), Myprintf);
std::cout << std::endl;
vector<int> vt3;
vt3.resize(vt.size() + vt2.size());
vector<int>::iterator it_end = set_union(vt.begin(), vt.end(), vt2.begin(), vt2.end(), vt3.begin());
std::cout << "两个容器的并集为:" << std::endl;
for_each(vt3.begin(), it_end, Myprintf);
std::cout << std::endl;
}

set_difference 求两个容器的差集set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
void Myprintf(int val)
{
std::cout << val << " ";
}
int main()
{
vector<int> vt;
vector<int> vt2;
for (int i = 0; i < 10; i++)
{
vt.push_back(i);
vt2.push_back(i+1);
}
std::cout << "容器所有值信息:" << std::endl;
for_each(vt.begin(), vt.end(), Myprintf);
std::cout << std::endl;
for_each(vt2.begin(), vt2.end(), Myprintf);
std::cout << std::endl;
vector<int> vt3;
vt3.resize(max(vt.size(),vt2.size()));
vector<int>::iterator it_end = set_difference(vt.begin(), vt.end(), vt2.begin(), vt2.end(), vt3.begin());
std::cout << "两个容器的差集为:" << std::endl;
for_each(vt3.begin(), it_end, Myprintf);
std::cout << std::endl;
}
