常用算法下一、常用拷贝和替换算法1.copy容器内指定范围内的元素拷贝到另一容器中。函数原型copy(iterator beg,iterator end,iterator dest);使用示例void print01(int val) { cout val ; } //copy void test01() { vectorintv; for (int i 0; i 10; i) { v.push_back(i); } for_each(v.begin(), v.end(), print01); cout endl; //copy复制 vectorintv2; v2.resize(v.size());//复制时空容器一定要预先指定大小 copy(v.begin(), v.end(), v2.begin()); for_each(v2.begin(), v2.end(), print01); cout endl; }空容器一定要提前开辟空间2.replace将指定范围内的旧元素修改为新元素。函数原型replace(iterator beg,iterator end,old value,newvalue);void test02() { vectorintv; for (int i 0; i 10; i) { v.push_back(i); } cout befor replace: endl; for_each(v.begin(), v.end(), print01); cout endl; //替换 cout after replace: endl; replace(v.begin(), v.end(), 0, 10); for_each(v.begin(), v.end(), print01); cout endl; }3.replace_if将区间内满足条件的元素替换成指定元素。函数原型replace_if(iterator beg,iterator end,_pred,newvalue);class myPlace { public: bool operator()(int val) { return val 7;//我的条件小于7的都满足我需要替换的条件 } }; void test03() { vectorintv; for (int i 0; i 10; i) { v.push_back(i); } cout 替换前 endl; for_each(v.begin(), v.end(), print02());// 0 1 2 3 4 5 6 7 8 9 cout endl; //替换 cout 替换后 endl; replace_if(v.begin(), v.end(), myPlace(), 7);//所有满足myPlace条件的都将替换成7 for_each(v.begin(), v.end(), print02());// 7 7 7 7 7 7 7 7 8 9 cout endl; }_Pred是谓词也是我们需要写的替换条件4.swap互换两个容器中的元素。函数原型swap(container c1,container c2);void test04() { vectorintv; for (int i 0; i 10; i) { v.push_back(i); } vectorintv2; for (int i 100; i 110; i) { v2.push_back(i); } cout before swap: endl; for_each(v.begin(), v.end(), print01); cout endl; for_each(v2.begin(), v2.end(), print02()); cout endl; //交换 cout after swap: endl; swap(v, v2); for_each(v.begin(), v.end(), print01); cout endl; for_each(v2.begin(), v2.end(), print02()); cout endl; }两个容器必须是同一种类型不需要留空间二者大小直接交换二、常用算术生成算法算术生成算法属于小型算法使用时应包含头文件#includenumeric1.accumulate计算区间内容器元素累计总和。accumulate(iterator beg,iterator end,value);value为起始叠加值即从什么开始累加void test05() { vectorintv; int sum 0; for (int i 0; i 10; i) { v.push_back(i); sum i; } int sum1 accumulate(v.begin(), v.end(), 0); cout sum endl;//55 cout sum1 endl;//55 }应用评委打分累加分数若value为0则从0开始加若value为100则从100开始加即容器内部元素总和加value为最终输出的值。2.fill向容器中填充指定的元素。函数原型fiil(iterator beg,iterator end,value);value为填充的值void test06() { vectorintv; v.resize(7);//指定容器大小默认为0现在是7个0 for_each(v.begin(), v.end(), print01);//0 0 0 0 0 0 0 cout endl; //后期重新填充 fill(v.begin(), v.end(), 6); for_each(v.begin(), v.end(), print01);//6 6 6 6 6 6 6 cout endl; }三、常用集合算法1.set_intersection求解两个容器的交集。set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);求解两个容器的交集并将交集放在目标容器中destvoid test07() { vectorintv1; for (int i 0; i 10; i) { v1.push_back(i); } vectorintv2; for (int i 5; i 18; i) { v2.push_back(i); } vectorintv3; v3.resize(min(v1.size(),v2.size())); //交集最好的情况就是其中一个容器是完全包含在另一个容器中的所以最大的交集个数为二者大小最小的 //获取交集 vectorint::iterator pos set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); //元素个数没有容器容量大的话会以默认值0填充所以我们会使用它返回的结束迭代器 for_each(v3.begin(), pos, print01); cout endl; }函数的返回值是一个迭代器是求解的交集中的最后一个元素的位置。遍历时就使用这个迭代器两个源容器需要是有序的序列才可以2.set_union求两个集合的并集。set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);两个集合必须是有序序列void test08() { vectorintv1; for (int i 0; i 12; i) { v1.push_back(i); } vectorintv2; for (int i 6; i 17; i) { v2.push_back(i); } vectorintv3; v3.resize(v1.size()v2.size());//最坏情况下是两个容器内的元素都不相同所以最大的是两个容器的大小和 vectorint::iterator pos set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); for_each(v3.begin(), pos, print01);//遍历结束在返回的容器结束迭代器位置否则会以0补充 cout endl; }返回的结果是一个迭代器是求解的并集中的最后一个元素的位置3.set_difference求两个集合的差集。set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);两个集合必须是有序的序列。求解两个容器的差集第一个容器和第二个容器的差集是指第一个容器中没有出现在第二个容器中的元素void test09() { vectorintv1; for (int i 0; i 13; i) { v1.push_back(i); } vectorintv2; for (int i 7; i 18; i) { v2.push_back(i); } for_each(v1.begin(), v1.end(), print01);//0 1 2 3 4 5 6 7 8 9 10 11 12 cout endl; for_each(v2.begin(), v2.end(), print01);//7 8 9 10 11 12 13 14 15 16 17 cout endl; //求差集 cout v1和v2的差集 endl; vectorintv3; v3.resize(max(v1.size(),v2.size())); vectorint::iterator pos set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); for_each(v3.begin(), pos, print01);//0 1 2 3 4 5 6 cout endl; }