C++ generic算法

标准库没有给每一个容器都定义了成员函数来完成一些额外的操作,反而使用了一些通用的算法来完成对应的操作!这些经典的算法都是提供了统一的接口所以叫做泛型算法。

#include <alogorithm>
#include <numeric>

一般算法不是操作对应的容器,而是使用两个迭代器指定的一个范围来操作完成!

int val = 42;
vector<int> vec;
auto result = find(vec.begin(), vec.end(), val);
cout << result << endl;

则 find() 函数的操作只要是使用的迭代器的方法则对应的可以完成查找具体的值的操作实现。如下面的列子:

string val = "result";
auto result = find(lst.cbegin(), lst.cend(), val);
//其中lst为定义的一个string 的变量!
int ia[] = {2, 12, 12, 34, 109, 84};
int val = 83;
int* result = find(begin(ia), end(ia), val);
//auto

算法永远是在迭代器上工作的,永远不会影响其中的容器的,但是可以通过迭代器修改容器中的值。定义在上面的头文件中的方法,使用时候应该优先了解其的特性。

只读算法:只是对容器中的元素进行读取,但是并不会修改对应的元素的值!

int sum = accumulate(vec.begin(), vec.end(), 0);
string sum = accumulate(v.cbegin(), v.vend(), string(""));
//这里的第三个参数不能一次只是传入一个为 "" 的值,
//因为其的类型为: const char *的。是不可以被修改的!
	equal(vec1.cbegin(), vec1.cend(), vec2.cbegin());

其传递的是三个参数,分别为对应的前面两者指定对应的需要比较的范围,后面的是另外一个容器的开始的位置,从当前位置开始比较其的实现。

写入容器中的算法:

vector<int>vec;
fill(vec.begin(), vec.end(), 1);

fill_n();
//方法传递的参数为三个分别是初始迭代器位置,对应范围,再者为取值。
//必须是对于已经存在赋值的容器进行操作!否则会出现未定义的错误!

replace 算法读入一个序列,并将其中所有等于给定的值的元素替换为新的元素!算法接受的为4个参数,前面的两个指定对应的迭代器的范围,后面的两个分别需要替代的值和替代后的目标值!

replace(list.begin(), list.end(), 0, 42);
//会修改原本的list的值,将其中的0 替换为42
replace_copy(list.begin(), list.end(), back_inserter(vec1), 0, 42);
//不会修改原本的值,只是生成一份拷贝,然后替换拷贝中的0全部为42的值。

sort() 排序, unique()的将重排的vec的容器使不重复的元素出现在vec的前面!

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

sort的是返回值为void的,unique的返回的是对应的迭代器的类型的。然后使用删除的方法完成删除其中其返回的迭代器的值!

谓词:可以实现将sort()的方法中传递第三个参数,来进行重载,完成自己想要的排序操作!一般是可以修改其默认的排序顺序<,或者是修改完成排序一些复杂的数据结构!

bool shorter(const string &s1, const string &s2) {
	return s1.size() < s2.size();
}
sort(words.begin(), words.end(), shorter);
stable_sort();//稳定排序和不稳定排序的差异!

lambda: 请看后续内容!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值