在之前的的编程练习中,逐渐了解到这三样东西,在C++中这三样东西对应的关键字分别是vector,iterator,algorithm,利用这三者可以极大地简化编程,使一般的程序变得优美简洁,因为之前有一段时间没有更博,今天想按照自己的理解简单地写一下这三样东西并举一些典型的例子(C++)。
有这样的一种说法:程序=数据结构+算法
我们可以这样理解,对于那三样东西:容器用来装载对应的数据结构;迭代器用来指向容器中的某对象;算法便就是算法了
1 算法 algorithm
常见内容见以下博客,点击链接跳转:
https://blog.csdn.net/wuce_bai/article/details/51027166
典型的函数有:
find()查找;
equal()判断是否相等;
sort()排序;
stable_sort()稳定排序;
merge()合并;
max()整个容器最大值;
max_element()用迭代器指定范围的最大值;
min()整个容器最小值;
min_element()用迭代器指定范围的最小值;
2:容器 vector
常见用法见下方博客链接,点击跳转:
https://blog.csdn.net/qinyuehong/article/details/92837359
容器的初始化工作,大致就是向容器中添加元素
vector<int> stu(N)//声明容器里放置int型 数量为N vector<string> stu(N)//声明容器里放置string 型 vector<structxxx> stu(N)//声明容器里放置自定义的结构体
3:迭代器 iterator
可以把其当作是指向数据的指针,或者说可以返回数据在容器中的位置,
常见用法:
vector<string>::iterator p; for(p=ss.begin();p!=ss.end();p++) { cout<<*p<<endl; }//首先定义迭代器p,然后从容器ss的首元素开始到尾元素依次输出,注意到输出取内容符加上迭代器p,这样才是输出每个数据
当然不用迭代器,依次输出容器内容也是可以的,譬如
for(int i=0;i<N;i++) { cout<<ss[i]<<endl; }//但是我们可以看到,这是在知道容器大小为N的情况下,否则还是用迭代器
4:容器库与算法库的结合,即实现了程序=数据结构+算法
以华为编程的一题举个典型的例子:
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int num; cin>>num; vector<string> ss;//声明一个容器 for(int i=0;i<num;i++)//讲输入的数据装入容器 { string s; cin>>s; ss.push_back(s); } sort(ss.begin(),ss.end());//调用算法库,直接从第一个元素至最后一个元素排序, vector<string>::iterator p;//利用迭代器依次遍历输出 for(p=ss.begin();p!=ss.end();p++) { cout<<*p<<endl; } return 0; }
5:总结
所以当我们遇到一些编程题目时,为了程序清晰明了,我们写下程序的流程大致如下:
A先把输入放到对应的容器中
B利用算法库对容器中的数据进行加工(例如排序,逆序,去重,查找等等)
C利用迭代器选择范围内的数据输出
6;一个稍微麻烦一点的例子
#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; bool compare(pair<string, int> a, pair<string, int> b) //将输入分为路径和后面的数字(行数),这个函数表示返回数字大的; //注意到,pair 中有两个值 一个是first另一个是second { return a.second > b.second; } int main() { string input, file;//一个是输入,一个是将截断输入获取文件名 vector<pair<string, int>> errors;//一个基本类型为pair的容器 while (getline(cin, input))//多次输入用while { if (input.size() == 0) { break; } unsigned int f = input.rfind('\\');//从右往左寻找\,注意到多一个\表示转义 file = input.substr(f + 1);//于是输入从右往左第一个\后面的就是文件名 errors.push_back(make_pair(file, 1));//将其放入容器并编号1 for (int i = 0; i<(errors.size() - 1); i++) { if (errors[i].first == file)//检查是否重名,若重名,将数目加一并删除一个相同的 { errors[i].second++; errors.pop_back(); break; } } } stable_sort(errors.begin(), errors.end(), compare);//按second大小排序,并且stable_sort是稳定排序 int idx = 0; while (idx<8 && idx<errors.size())//最多8个 { string check = errors[idx].first; int t = check.find(' ');//空格前面的即文件名 if (t>16)//文件名称不超过16 { errors[idx].first.erase(0, t - 16); } cout << errors[idx].first << ' ' << errors[idx].second << endl; idx++; } }
计划在接下来的时间把以前漏掉的博客补上,譬如把剑指offer写完并总结总结加上注释等等。然后还有一个大的想法:就是将我在大学里所学的基础知识例如数据结构,操作系统,计算机网络,数据库原理,云计算技术,算法导论,Java,C++,软件工程,编译原理等等这些自己学习的知识按照自己的理解将自己认为比较有趣重要的知识做一些总结,但愿能在毕业之前能做好吧,但是也不一定,哈哈哈哈哈哈哈哈哈,祝大家开心快乐!