1.常用遍历算法
1.1 for_each
for_each(v1.begin(),v1.end(),show); void show(int &n) //回调函数的入口地址 { cout << n << " "; } class show //函数对象 { public: void operator()(int &n) { cout << n << " "; } protected: private: }
for_each算法返回值是函数对象,可以记录函数的运行状态(函数对象被调用次数)
1.2 transform
一个容器的元素 通过op(函数对象) 变换到另一个容器中(同一个容器)
两个容器的元素 通过op 变换到另一个容器中。
注:如果目标与源相同,transform()和for_each()一样;
如果想以某值替换符合规则的元素,应使用replace()(是transform的特例,但速度更快)
transform(v1.begin(),v1.end(),increase); //回调函数 transform(v1.begin(),v1.end(),negate<int>()); //预定义函数对象 transform(v1.begin(),v1.end(),bind2nd(multiplies<int>(),10)); //函数适配器和函数对象
//把运算结果直接输出到屏幕 #include "iterator" //输出流迭代器的头文件 transform(v1.begin(),v1.end(),ostream_iterator<int>(cout," "),negate<int>()); int increase(int& a) //返回值为int { return a+1; }
区别:
for_each算法中的函数对象 参数一般为引用,无返回值
速度快,但不灵活
transform算法中的函数对象 参数一般为元素,有返回值,返回类型也为元素
速度慢,灵活;输出到原来位置,也可以输出到其他位置;
常用查找算法:(返回值是bool类型)
adjacent_find(v1.begin(),v2.begin()); //找元素中第一个重复的迭代器位置; //distance(v1.begin(),it); //可求迭代器的下标
有序序列中的二分查找:
binary_search(v1.begin(),v1.end(),7); //(返回值是bool类型) find(v1.begin(),v1.end(),5); //返回迭代器位置 find_if(v1.begin(),v1.end(),GreatThree); //谓词
计数算法://返回值是元素的个数
count(v1.begin(),v1.end(),7); count_if(v1.begin(),v1.end(),bool类型的谓词); //可以对自定义数据类型进行计数
排序:
合并排序,是归并排序中的最后一步
merge(v1.begin(),v1.end(),v1.begin(),v2.end(),v3.begin()); sort(v1.begin(),v1.end(),CompareS); //利用谓词对自定义数据类型的排序
随机洗牌:
random_shuffle(v1.begin(),v1.end()); //将v1乱序 //V1可以是一个字符串。。。string
反转:
reverse(v1.begin(),v1.end()); //两个指针交替往中间走,互换值
拷贝和替换:
vector<int>v2; v2.resize(v1.size()); copy(v1.begin(),v1.end(),v2.begin()); replace(v1.begin(),v1.end(),3,8); //v1中所有3替换为8; replace_if(v1.begin(),v1.end(),great_equal_5,1);//满足谓词的元素全部替换为1; swap(v1,v2);
常用的算术和生成算法: #include <numeric>
accumulate(v1.begin(),v1.end(),100); //范围内元素求和再加上100,返回最后的值 fill(v1.begin(),v1.end(),8); //范围内元素全部填充为8;
常用的集合算法:交集,并集,差集
//并集: set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin()); //交集: set_intersection(); //差集 set_difference();