C++Primer读书笔记(第三章)
来源:互联网 发布:淘宝榫卯实木家具 编辑:程序博客网 时间:2024/05/16 09:07
第三章标准库类型
3.1 命名空间的using声明
每个名字都需要一个using声明,但是有一种情况,必须总是使用完全限定的标准库名字:在头文件中。理由是,在头文件中放置using声明,就相当于在包含该头文件的所有程序中都放置了同一using声明。
3.2 标准库string类型
千万注意,string类型与字符串字面值不是同一类型。string对象最后没“\n”。
#include <string>
using std::string;
3.2.1 string对象的定义和初始化
string s1; //默认构造函数
string s2 (s1); //将s2初始化为s1的一个副本
string s3 (“value”); //将s3初始化为字符串字面值的一个副本
string s4 (n, ‘c’); //将s4初始化为n个字符’c’的副本
3.2.2 string对象的读写
(1)标准输入读取string:
读取并忽略开头所有空白字符(空格、换行符、制表符);
读取字符直至再次遇到空白符为止。
(2)用getline读取整行文本:
istream getline (istream cin, string line);
不忽略开头的换行符,只要遇到换行符就停止,不保存最后的换行符。即便它是第一个输入符,line被置为空sting。
3.2.3 string对象的操作
string s; //s为字符组对象
(1)s.size(),返回字符串s中字符的个数,其数据类型不是整型,而是string::size_type类型(是一个unsigned类型)。不能把size的返回值赋给一个int变量。
(2)s.empty(),返回字符串s是否为空的布尔值。
(3)支持关系操作符<,<=,>,>=。比较时采用和(大小写敏感)字典排序相同的策略。
(4)支持赋值操作,但是确实存在效率问题。
(5)支持两个string对象相加。
(6)支持和字符串字面值的连接。当进行string对象和字符串字面值混合连接时,+操作符的左右操作数必须至少一个是string类型。
string s1 (“hello, ”); string s2 (“world\n”); string s3 = s1 +s2;
string s1 (“hello”); string s3 = s1 + “, world”; //效果等同于上一行!
(7)支持下标操作,从0开始,s[s.size() - 1]是最后一个字符。并且下标操作可用作左值,更改字符串的某个字符。索引值应该用sting::size_type类型变量,这样保证索引值不小于0,并且会自动检测不超过上界s.size() – 1。
3.2.4 string对象中字符的处理
对单个字符的操作函数,在cctype头文件中!
isalnum(c) //是数字或者字母,则为true; isalpha(c) //是字母,则为true;
iscntrl(c) //控制符 isdigit(c) //数字 isgraph(c) //不是空格,但可打印
islower(c) //小写 isupper(c) //大写 isprint() //可打印字符
ispunct(c) //标点符号 isspace(c) //空白字符
tolower(c) //转为小写 toupper(c) //转为大写
3.3 标准库vector类型
vector是同一种类型的对象集合,属于容器的一种。vector只是一个类模板,可以指定任意类型的对象,比如: vector<int> ivec; vector<string> svec;
#include <vector>
using std::vector;
3.3.1 vector对象的定义和初始化
vector<T> v1; //默认构造函数,v1为空
vector<T> v2 (v1); //v2是v1的副本
vector<T> v3 (n, i); //v3包含n个值为i的元素
vector<T> v4 (n); //v4含有值初始化元素的n个副本
vector对象的重要属性就在于可以在运行时高效地添加元素,后续详解。
3.3.2 vector对象的操作
(1)v.empty()和v.size(),赋值,比较等等操作。
(2)v.push_back(T val); 将新值插入到vector对象v的后面。
(3)vector的下标操作只能进行对已有元素的索引,不能进行添加元素操作。
3.4迭代器简介
除了使用下标来访问vector对象的元素,标准库还提供了迭代器访问元素的方法。迭代器是一种检查容器内元素并遍历元素的数据类型。所有标准库容器都定义了相应的迭代器类型!
3.4.1 容器的iterator类型
vector<int>::iterator iter;
3.4.2 begin和end操作
如果容器中有元素的话,由begin返回的迭代器指向第一个元素:
vector<int>::iterator iter = ivec.begin();
由end操作返回的迭代器指向vector的末端元素的下一个,指向一个不存在的元素。如果vector为空,则begin和end返回的迭代器相同。end只是起个哨兵作用,表示已处理完vector中所有元素。
3.4.3 vector迭代器的自增和解引用运算
迭代器使用解引用操作符(*)来访问迭代器所指向的元素:
*iter = 0;
++iter; //表示指向下一个元素
3.4.4 迭代器的其它操作
如果两个迭代器指向同一个元素,那么久==,否则为!=。
3.4.5 迭代器的应用程序示例
for(vector<int>::iterator iter =ivec.begin(); iter != ivec.end(); ++iter)
*iter= 0;
3.4.6 const_iterator
每个容器还定义了一种名为const_iterator的类型,只能用于读取容器内的元素,但不能改变其值。
当我们对普通iterator类型解引用时,得到对某个元素的非const引用。而如果对const_iterator类型解引用时,则可以得到一个指向const对象的引用。
vector<int>::const_iterator iter = ivec.begin();
3.4.7 迭代器的算术操作
iter1– iter2; 用于计算两个迭代器对象的距离,是名为difference_type的signed类型的值。与size_type类型类似,但是是有符号的。
iter + n; 加减的值不是整型,而是size_type或者difference_type。
vector<int>::iterator mid = ivec.begin() + ivec.size() / 2;
热河改变vector长度的操作都会使已存在的迭代器失效。例如,在调用push_back之后,就不能再信赖指向vector的迭代器的值了。
3.5 标准库bitset类型
bitset类简化二进制位的有序集(都是0,1)的处理。bitset也是一种类模板,但是其尽在长度上有区别,如bitset<32> bitvec;。
#include <bitset>
using std::bitset;
3.5.1 bitset对象的定义和初始化
bitset<n> b; //b有n位,都为0
bitset<n> b(u); //b是unsigned long型u的一个副本
bitset<n> b(s); //b是string对象s中含有的位串的副本
bitset<n> b(s, pos, n); //b是s中从位置pos开始的n个位的副本
注:当用string对象初始化bitset对象时,从string对象读入位集的顺序是从右向左:
string strval (“1100”); bitset<32> bitvec (strval);
bitset中第2,3位是1,其余都为0。
3.5.2 bitset对象上的操作
(1)b.any(); //b中是否存在置为1的位? b.none(); //b中全0?
b.count(); //b中位为1的个数 b.size(); //b中的总位数
count和size返回的值类型都为size_t类型,定义在cstddef头文件中,也是一个unsigned有关的类型,其大小足以保证存储内存中对象的大小。
(2)b[pos]; //下标操作 b.text(pos);//下标为pos位是否为1?
b.set();//所有位都置1 b.reset(); //所有位都置0 b.flip(); //所有位都取反
b.set(pos);//pos位置1 b.reset(pos);//pos位置0 b.flip(pos);//pos位取反
(3)b.to_ulong(); //用b中同样的二进制位返回一个unsigned long值
os<< b; //把b中的位集输出到os流。
bitset<32> bitvec (0xffff);
cout<< “bitvec: ” << bitvec << endl; //输出结果
- C++Primer读书笔记(第三章)
- C++Primer再读读书笔记:第三章
- C++Primer读书笔记第三章(上)
- C++Primer读书笔记第三章(下)
- C++primer 第三章
- C++primer 第三章
- C++Primer读书笔记(第二章)
- C++Primer读书笔记(第四章)
- C++Primer读书笔记(第五章)
- C++Primer读书笔记(第六章)
- C++Primer读书笔记(第七章)
- C++Primer读书笔记(第八章)
- C++Primer读书笔记(第九章)
- C++Primer读书笔记(第十章)
- c++primer第三章习题(1)
- c++primer第三章习题(2)
- c++primer 第三章习题(3)
- c++primer 第三章习题(4)
- Android开源项目
- 运行Tomcat出现the JRE_HOME environment variable is not defined correctly
- MySQL在大型网站的应用架构演变
- 黑马程序员_Java_多线程总结
- Android开发之InstanceState详解
- C++Primer读书笔记(第三章)
- php编程文件上传代码
- mac eclipse svn subeclipse: Failed to load JavaHL Library.
- 今天天气很不错了
- 今日作息及食谱(6.18)
- C++Primer读书笔记(第四章)
- 增加最大 TCP/IP 可用端口数
- 不安装任何软件,如何在宿舍远程局域网的电脑
- PAT1017. A除以B (20)