3_STL算法

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();

 

posted @ 2016-09-07 19:12  Lunais  阅读(287)  评论(0编辑  收藏  举报