泛型算法

动机

容器定义了自己的成员函数,但是很多操作都是通用的,可以通过一套算法。用于不同类型的容器,多好。

#include<algorithm>
#include<numeric> //一些数值泛型

算法本质通过迭代器访问元素

1.算法执行容器的操作,执行的是迭代器的操作,所以不会更改底层的容器的大小,即不会增加或删除元素。

2.算法依赖容器元素类型的一些操作,比如find函数得需要元素类型支持比较操作。

算法分类

1.只读算法

1.equal算法不要求容器类型,元素类型必须一致,但是得可以比较。

equal(roster1.cbegin(), roster1.cend(), roster2.cbegin()); //roster1可以是vector<string>, roster2可以是list<const char*>

2.写算法

有些算法有copy版本,即创建一个新序列,在新序列上更改

replace(list.begin(), list.end(), 0 ,42); //把是0的地方换为42
replace_copy(list.cbegin(), list.cend(), back_inserter(ivec), 0 ,42); //ivec是list的拷贝,然后在ivec上操作

3.排序算法

1.sort函数使用元素类型的<运算符

2.sort还是unique都不能删除元素,想删除调用容器的操作。

void elimDups(vector<string> &words)
{
    sort(words.begin(), words.end());
    auto end_unique = unique(words.begin(), words.end());  //end_unique不是引用

    cout<<typeid(end_unique).name()<<endl; // N9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEE 什么玩意
    words.erase(end_unique, words.end()); //words.end()返回的是引用

}

4.返回类型

上面的auto貌似不是引用类型的,所以泛型算法貌似不返回引用啊,容器里的操作倒是返回引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值