Snowming04's Blog
一颗红❤
Toggle navigation
Snowming04's Blog
主页
Cobalt Strike
Accelerated C++
区块链安全
友链
关于我
常用工具
代码积累
归档
标签
【Accelerated C++】课时5:使用顺序容器并分析字符串
? C++ ?
2020-03-30 17:02:36
150
0
0
snowming
? C++ ?
# 0x00 前言 C++的标准库提供了有用的数据结构和函数,还提供了很多库容器。  库容器的行为特征具有一致性。 本章就重点学习C++的库容器。 # 0x01 按类别来区分学生 需求升级:现在我们不仅希望算出学生的成绩,同时还想知道哪些学生不能通过这一门成绩。 先写一个简单的判断一个学生是否不及格的函数: ``` //判断学生是否不及格 bool fgrade(const Student_info& s) //读入 Student_info 结构的引用,不改变其值 { return grade(s) < 60; } ``` 解决思路:逐个检查所有学生的记录,然后在两个向量(通过&非通过)中选择一个来存放它。这两个向量中的一个是用来存储成绩及格的学生记录的,另一个则为成绩不及格的学生记录而设。 ``` //第一次尝试,把及格和不及格的学生记录分离开来 vector<Student_info> extract_fails(vector<Student_info>& students) { vector<Student_info> pass, fail; for (vector<Student_info>::size_type i = 0; i != students.size(); ++i) { if (fgrade(students[i])) fail.push_back(students[i]); else pass.push_back(students[i]); } students = pass; return fail; } ``` 代码思路:  ## 就地删除元素  **<u>erase(students.begin()+i)</u>**  在循环中不用给 i 加一:  # 0x02 迭代器  ## 迭代器类型  **<u>一个迭代器实例</u>**   ## 迭代器操作 **<u>从迭代器取元素</u>**  **<u>间接引用*和-></u>**  # 0x03 用迭代器来代替索引 原索引: ``` vector<Student_info> extract_fails(vector<Student_info>& students) //非常量引用 { vector<Student_info> fail; vector<Student_info>::size_type i = 0; while( i != students.size()) { if(fgrade(students[i])) { fail.push_back(students[i]); students.erase(students.begin() + i); } else { ++i; } } return fail; } ``` 改为迭代器: ``` vector<Student_info> extract_fails(vector<Student_info>& students) { vector<Student_info> fail; vector<Student_info>::iterator iter = students.begin(); while(iter != students.end()) { if(fgrade(*iter)) { fail.push_back(*iter); iter = students.erase(iter); } else { ++iter; } } return fail; } ```  **<u>iter = students.erase(iter);</u>**  # 0x04 重新思考数据结构以实现更好的性能 ## list 类型   ## 一些重要的差别   **<u>list类型的成员函数sort</u>** ``` students.sort(compare); //compare是谓词,自定义的比较函数 ```  **<u>一个恼人的话题</u>** - list -> 方便删,更适合大规模 - vector -> 方便找,更适合小规模 ## 分割字符串 字符串也支持索引操作,而且它采用的方式跟vector几乎是一样的。因此,如果s是一个字符串并且它至少有一个字符,那么s的第一个字符就是`s[0]`,它的最后一个字符则是`s[size()-1]`。 - `<cctype>`头文件,这个头文件中定义了有用的函数来让我们处理**独立的字符**。这个头文件中定义了 isspace 函数,用于判断某个字符是不是空白。  ## 测试 split 函数  上面的测试程序的结果可以跟以下程序的输出进行比较,因为split函数跟下图中的库函数做了一样的工作:  ## 连接字符串 「字符图案」问题:一幅字符图案是一个矩形的可显示的字符阵列,是以位图为基础的。简化的方法是:用字符串来代替位,并写输出到普通文件中,而不是把它在图形硬件上显示出来。 解决方法:用一个 `vector<string>` 类型的向量来表示一幅图案,这个向量中的每一个元素都是图案的一行。 **<u>一个找出向量中最长的字符串长度的函数</u>**  ``` string::size_type width(const vector<string>& v) //const只读取不改变 { string::size_type maxlen = 0; for(vector<string>::size_type i = 0; i != v.size(); ++i) { maxlen = max(maxlen, v[i].size()); //max 函数返回左右两个比较数中的较大者 } return maxlen; } ``` # 0x05 本章总结 ## 容器与迭代器    ## 迭代器操作   ## 字符串类型  ## 向量类型  ## list类型  ## cctype头文件  
上一篇:
【Accelerated C++】课时6:使用库算法
下一篇:
朴实无华的域初学者
0
赞
150 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册