【C++学习】泛型算法

标准库提供的算法大多独立于任何特定容器,这些算法是通用的(generic 泛型的)可以作用于不同的容器 不同类型的元素。

大部分算法在algorithm中,还有一些在numeric里。

不直接作用于容器,而是用迭代器来指定元素范围

1.1只读算法

只读取元素不改变元素的算法

1. find (开始范围,结束范围,搜索值 )

如果找到就返回指向第一个匹配元素的迭代器。如果没有找到则返回第二个参数。

vector中查找

int val=42;
auto result=find(vec.cbegin(),vec.cend(),val);

list中查找

string val="a value";
auto result=find(lst.cbegin(),lst.cend(),val);

数组中查找

int ia[]={
    
    27,210,12,47,109};
int val=83;
int* result=find(begin(ia),end(ia),val);

序列指定范围查找

auto result=find(ia+1,ia+4,val);

迭代器令算法不依赖于容器,但算法依赖于元素类型的操作

2.accumulate(开始位置,结束位置,和的初值)(numeric)

第三个参数决定了函数中使用哪个加法运算符以及返回值的类型。

扫描二维码关注公众号,回复: 12720551 查看本文章
int sum=accumulate(vec.begin(),vec.end(),0);

此函数默认序列元素能和第三个参数匹配,或者能转换成第三个参数类型。

string sum=accumulate(v.begin(),v.end(),string(""));

显式的创建了string类型,如果直接传入字符串字面值,用于保存和的对象类型是const char* ,const char*没有+运算符,会产生编译错误。

3. equal (第一个序列开始,第一个序列结束,第二个序列开始)操作两个序列的算法

使用时保证第二个序列至少和第一个序列数目一样多

equal(a.begin(),a.end(),n.begin());

由于是使用迭代器来操作,因此不要求两个容器是一个类型,也不要求两个容器元素类型相同
比如 vector<string > list<const char*>

1.2 写容器的算法

1.fill

fill(vec.begin(),vec.end(),0);
fill(vec.begin(),vec.begin()+vec.size()/2,10);

2…fill_n

fill_n(vec.begin(),vec.size(),0);
fill_n(vec.begin(),10,0);

3.back_inserter

vector<int> vec;
auto it=back_inserter(vec);
*it=42;

在这里插入图片描述

4.copy

在这里插入图片描述

5.replace(序列开始,序列结束,搜索值,替换值)

replace(list.begin(),listy.end(),0,42;

1.3重排元素算法

消除重复单词

void elimdups(vector<string>& words){
    
    
sort(word.begin(),word.end());
auto end_unique=unique(word.begin(),word.end());
erase(end_unique,word.end());
}

2.向算法传递函数

猜你喜欢

转载自blog.csdn.net/qq_37581730/article/details/108631853