拷贝和替换算法
copy
功能描述:容器内指定范围的元素拷贝到另一个容器中
函数原型:
//将开始迭代器到结束迭代器之间的元素拷贝到目标容器中 //beg 开始迭代器 //end 结束迭代器 //dest 目标开始迭代器 copy(iterator beg, iterator end, iterator dest);
replace
功能描述:将容器内指定范围的旧元素替换为新元素
函数原型:
//将区间内旧元素替换成新元素 //beg 开始迭代器 //end 结束迭代器 //oldvalue 旧元素 //newvalue 新元素 replace(iterator beg, iterator end, oldvalue, newvalue);
案例:
vector<int> v={10,20,10,30,10,40}; //将10替换成1000 replace(v.begin(), v.end(), 10, 1000);
replace_if
功能描述:将区间内满足条件的元素,替换成指定元素
函数原型:
//按条件替换元素,满足条件的替换成指定元素 //beg 开始迭代器 //end 结束迭代器 //_pred 谓词 //newvalue 替换的新元素 replace_if(iterator beg, iterator end, _pred, newvalue);
案例:
#include<iostream> using namespace std; #include<vector> #include<algorithm> //常用拷贝和替换算法replace_if class MyPrint { public: void operator()(int val) { cout << val << " "; } }; class Greater20 { public: bool operator()(int val) { return val > 20; } }; void test01() { vector<int> v={1,10,20,30,20,50,10}; cout << "before replace " << endl; for_each(v.begin(), v.end(), MyPrint()); cout << endl; //大于20替换成1000 replace_if(v.begin(), v.end(), Greater20(), 1000); cout << "after replace " << endl; for_each(v.begin(), v.end(), MyPrint()); cout << endl; } int main() { test01(); return 0; }
swap
功能描述:互换两个容器的元素
函数原型:
//互换两个容器的元素 //c1容器1 //c2容器2 swap(container c1, container c2);
算术生成算法
算术生成算法属于小型算法,使用时包含的头文件为#include<numeric>
accumulate
功能描述:计算区间内容器元素累计总和
函数原型:
//计算容器元素累计总和 //beg 开始迭代器 //end 结束迭代器 //value 起始值 accumulate(iterator beg, iterator end, value);
案例:
#include<iostream> using namespace std; #include<vector> #include<numeric> //常用算术生成算法 void test01() { vector<int> v; for (int i = 0; i <= 100; i++) { v.push_back(i); } int total = accumulate(v.begin(), v.end(), 0);//参数3 起始累加值 cout << " total = " << total << endl; } int main() { test01(); return 0; }
fill
功能描述:向容器中填充指定的元素
函数原型:
//向容器中填充元素 //beg 开始迭代器 //end 结束迭代器 //value 填充值 fill(iterator beg, iterator end, value);
案例:
vector<int> v; v.resize(10); fill(v.begin(), v.end(), 100);
集合算法
set_intersection
功能描述:求两个容器的交集
函数原型:
//求两个容器的交集 //注意:两个集合必须是有序序列,目标容器开辟空间需要从两个容器中取小值,set_intersection返回值即是交集中最后一个元素的位置 //beg1 容器1开始迭代器 //end1 容器1结束迭代器 //beg2 容器2开始迭代器 //end2 容器2结束迭代器 //dest 目标容器开始迭代器 set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
案例:
#include<iostream> using namespace std; #include<vector> #include<algorithm> //常用集合算法set_intersection void myPrint(int val) { cout << val << " "; } void test01(){ vector<int> v1={1,2,3,4,5}; vector<int> v2={1,3,6,9}; vector<int> vTarget; //目标容器需要提前开辟空间 //最特殊情况大容器包含小容器开辟空间取小容器的size即可 vTarget.resize(min(v1.size(), v2.size())); //获取交集 vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin()); for_each(vTarget.begin(), itEnd, myPrint); cout << endl; } int main() { test01(); return 0; }
set_union
功能描述:求两个集合的并集
函数原型:
//求两个集合的并集 //注意:两个集合必须是有序序列 //beg1 容器1开始迭代器 //end1 容器1结束迭代器 //beg2 容器2开始迭代器 //end2 容器2结束迭代器 //dest 目标容器开始迭代器 set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
案例:
#include<iostream> using namespace std; #include<vector> #include<algorithm> //常用集合算法set_union void myPrint(int val) { cout << val << " "; } void test01(){ vector<int> v1={1,2,3}; vector<int> v2={4,5,6}; vector<int> vTarget; //目标容器需要提前开辟空间 //最特殊情况两个容器没有交集,并集就是两个容器size相加 vTarget.resize(v1.size() + v2.size()); //获取交集 vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin()); for_each(vTarget.begin(), itEnd, myPrint); cout << endl; } int main() { test01(); return 0; }
set_difference
功能描述:求两个集合的差集
函数原型:
//求两个集合的差集 //注意:两个集合必须是有序序列 //beg1 容器1开始迭代器 //end1 容器1结束迭代器 //beg2 容器2开始迭代器 //end2 容器2结束迭代器 //dest 目标容器开始迭代器 set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
案例:
#include<iostream> using namespace std; #include<vector> #include<algorithm> //常用集合算法set_union void myPrint(int val) { cout << val << " "; } void test01(){ vector<int> v1={1,2,3,4,5}; vector<int> v2={2,4,5,6,8}; vector<int> vTarget; //目标容器需要提前开辟空间 //最特殊情况两个容器相交开辟空间取大容器的size即可 vTarget.resize(max(v1.size(), v2.size())); cout << "v1 and v2's difference set is : " << endl; vector<int>::iterator itEnd =set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin()); for_each(vTarget.begin(), itEnd, myPrint); cout << endl; cout << "v2 and v1's difference set is : " << endl; itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin()); for_each(vTarget.begin(), itEnd, myPrint); cout << endl; } int main() { test01(); return 0; }