一直在研读《C++ Primer》,记录了一些笔记。由于之前的内容没有做电子笔记,之后有时间再补充啦!
泛型是过去的大师们已经封装好的算法操作,让我们解决问题时更加便捷。但作为初学者的我,更应该去思考这些函数背后的底层实现逻辑,而不仅仅是去背这些函数。只有这样,我们才能从使用工具的人成长为研发工具的人!
目录
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;
}
如有不足,恳请指正!