您的位置:首页 > 其它

泛型算法

2018-01-02 22:56 85 查看
1、泛型算法:建立在容器上的操作。

      泛型:算法适用于不同的容器和数据类型。

2、头文件:#include<algorithm>  //大多数泛型算法

                     #include<numeric>  //数值泛型算法

3、迭代器使算法不依赖于容器,算法依赖于元素类型的操作。标准库算法对一定范围内的元素进行操作,这个范围是输入范围。算法不会执行容器操作(扩展容器、删除元素)。

4、

(1)只读算法:

    accumulate(c.cbegin(),c.cend(),初始值) // 求一个范围元素的和,初始值若为string则应为string("str")

    equal(c.cbegin(),c.cend(),d.cbegin())   //比较d与c是否相等

 (2)写容器元素算法:

 fill(c.begin(),c.end(),string("str"))        //将所有元素置为str

 fill_n(c.begin(),n,val)   //将n个元素置为val

back_inserter(vec)  //返回指向该向量的迭代器

(3)拷贝算法:

auto c=copy(begin(a),end(a),b);  //copy 将a数组的一定范围内的元素拷贝到b中,返回b尾元素之后的位置。

(4)容器元素排序算法:

sort(a.begin(),a.end()); //从小到大对容器中的元素排序

 auto unique_end=unique(story.begin(),story.end()); // unique函数将排序后重复的元素移动到最后,返回最后一个不重复元素的下一个位置。还要调用erase删除重复元素。

  谓词:可调用的表达式,有一元谓词(一个参数)和二元谓词(二个参数),谓词的参数类型要与元素的参数类型保持一致。

bool isShorter(const string&s1,const string&s2)  //二元谓词

{return s1.size()<s2.size();}

sort(a.begin(),a.end(),isShorter);  //单词从短到长排序

(5)定制操作

lambda表达式:[capture list](parameter list)->return type{function body}

捕获列表(调用lambda的函数的局部变量),参数列表,返回值类型可以省略。调用时与调用函数相同。可以当成谓词使用。

auto f=[]{return 45;} ;   cout<<f();

auto f=[v1]{return v1;};

auto f=[&v1]{return v1;};

[&]{} 、 [=]{}  //lambda可以推断要使用的变量。(&:推断使用的引用,=:推断使用的值)

transform(a.begin(),a.end(),a.begin(),[](int i)->int{if(i>3) return 3;else return 0;)};    //含if语句要指定返回值类型

(6)迭代器:

插入迭代器:绑定到容器上,用于插入元素      back_inserter  front_inserter   inserter

流迭代器:绑定到输入、输出流上,遍历IO流      istream_iterator   ostream_iterator

反向迭代器:从尾元素到首元素移动。  //  rbegin()   rend();

移动迭代器:移动元素

(7)泛型算法模式:

alg(beg,end,other args);

alg(beg,end,dest,other args);   //dest:位置

alg(beg,end,beg2,other args);  

alg(beg,end,beg2,end2,other args);

(8)泛型算法的操作对象:

容器、数组、IO流。算法在迭代器上操作,与实现类型无关。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: