泛型1(C++ Primer)

一直在研读《C++ Primer》,记录了一些笔记。由于之前的内容没有做电子笔记,之后有时间再补充啦!

泛型是过去的大师们已经封装好的算法操作,让我们解决问题时更加便捷。但作为初学者的我,更应该去思考这些函数背后的底层实现逻辑,而不仅仅是去背这些函数。只有这样,我们才能从使用工具的人成长为研发工具的人!

目录

1.概念

2.特点

3.头文件

4.基本算法

4.1只读

4.1.1find

4.1.2count

4.1.3accumulate

4.1.4equal

4.2要写

4.2.1fill

4.2.2copy

4.2.3replace

4.3重排

4.3.1sort

4.3.2unique

4.3.3例


1.概念

标准库没有给每个容器添加大量功能,而是提供了一组算法,这些算法大多独立于特定容器,是通用的。

2.特点

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

3.头文件

#include<algorithm>//大多数
#include<numeric>

4.基本算法

4.1只读

注意:在只读操作中,迭代器用cbegin()、cend()更好。

4.1.1find

在vec中begin()到end()范围间查找元素val,返回类型同val

auto result=find(v.cbegin(),v.cend(),val);

4.1.2count

返回给定值在序列中出现的次数

int c=count(v.cbegin(),v.cend(),val);

4.1.3accumulate

求和(在<numeric>中)

int sum=accumulate(v.cbegin(),v.cend(),0);

将vec中所有string元素连接起来

string sum==accumulate(v.cbegin(),v.cend(),string(" "));

第三个参数的类型决定了返回值的类型

4.1.4equal

确定两个序列保存的值是否相同,相等则true,否则false

equal(v1.cbegin(),v1.cend(),v2.cbegin());

4.2要写

4.2.1fill

将元素都置0

fill(v.begin(),v.end(),0)

4.2.2copy

把a1的内容拷贝给a2,ret指向拷贝到a2的尾元素之后的位置

auto ret=copy(begin(a1),end(a1),a2);

4.2.3replace

将序列中的所有0都替换为1

replace(v.begin(),v.end(),0,1)

4.3重排

4.3.1sort

从小到大排序

sort(v.begin(),v.end());

4.3.2unique

重排vec,将不重复的元素放在了在vec开始部分。返回最后一个不重复元素位置的迭代器end

注意:并没有删除重复元素,只是放到原容器的末尾了

auto end=unique(v.begin(),v.end());

4.3.3例

输入一段单词,将单词按字母先后顺序排列,并删除重复元素

输入:the quick red fox jumps over the slow red turtle

输出:fox jumps over quick red slow the turtle

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

void DelWords(vector<string>& w);

void DelWords(vector<string> &w)
{
	//按字母顺序给单词排序
	sort(w.begin(), w.end());
	//将重复的元素放到w尾部
	auto end = unique(w.begin(), w.end());
	//删除尾部重复元素
	w.erase(end, w.end());
}
int main()
{
	vector<string> w;
	//手动输入
	w.push_back("the");
	w.push_back("quick");
	w.push_back("red");
	w.push_back("fox");
	w.push_back("jumps");
	w.push_back("over");
	w.push_back("the");
	w.push_back("slow");
	w.push_back("red");
	w.push_back("turtle");

	//先输出一次
	for (auto it = w.begin(); it != w.end(); it++)
		cout << *it << " ";
	DelWords(w);
	//再输出一次对比
	cout << endl;
	for (auto it = w.begin(); it != w.end(); it++)
		cout << *it << " ";
	return 0;
}

如有不足,恳请指正!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~在下小吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值