C++ Primer 第三章 标准库类型
标准库类型是我之前没有接触过内容,不仅是这一章,整本书有很多东西对我来说都是新的,谭伯伯那本介绍的东西只是C++中的皮毛罢了。感觉到学习C++将是个无底洞。学到什么程度才算高深,我现在心里没数,只能硬着头皮,踏着那倔强的神经学下去。
第2章所涉及的类型都是低级数据类型:这些类型表示数值或字符的抽象,并根据器具体机器表示来定义。
本章介绍两种最重要的标准库类型string和vector。string类型支持长度可变的字符串,vetor可用于保存一组指定类型的对象。
3.1
命名空间的using声明
前面看到过std::cin这样的读取数据操作,如果每次读取数据时都这么写代码会感觉非常麻烦和不简洁,现在介绍一种最安全的机制:using声明。
-使用using声明,我们可以直接引用名字,而不需要在引用改名字的命名空间。
如: using std::cin;
-每个名字都需要一个using声明
如以下代码:
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{
cout<< “Enter two number:”<<endl;
int v1,v2;
cin>>v1>>v2;
cout<< “The sum of”<<v1
<<“ and”<<v2
<< “is”<<v1+v2<<endl;
return 0;
}
-对cin,cout和endl进行using声明,就意味着以后可以省去前缀std::,直接使用命名空间中的名字,这样代码可以更易读。
3.2
标准库string类型
摘要:
string类型的输入操作符:
Ø读取并忽略开头所有空白字符
Ø读取字符直至再次遇到空白字符,读取终止。
用getline读取整行文本:
-这个函数接受两个参数:一个输入流对象和一个string对象
-与输入操作符不一样:不忽略行开头发换行符。
关于string对象的操作
size和empty操作
可以用size操作获取string对象的长度(字符的个数)
如:对象s,调用size函数:s.size();
也可以用来判断string对象是否为空:
if(s.size()==0)
判断string对象是否为空第二种方法就是用empty操作
if(s.empty())
empty()成员函数将返回bool值,string对象为空则返回true,否则返回false。
string::size_type类型
-size操作返回的是string::size_type类型的值
它定义为与unsigned型具有相同含义,并且可以保证足够大能够存储任意string对象的长度。
从string对象获取字符
-下标操作符需要一个size_type类型的值,来标明要访问字符的位置。
-string对象的下标从0开始,对象s的最后一个字符表示为s[s.size()-1]
可以用下标操作符分别取出string对象的每个字符,分别输出:
string str(“some string”);
for(string::size_typeix=0;ix!=str.size();++ix)
cout<<str[ix]<<endl;
-下标操作可用作左值
for(string::size_typeix=0;ix!=str.size();++ix)
str[ix]=’*’;
string对象中字符的处理都在cctype头文件定义。
标准库vector类型
-vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。
-vector被称为容器,是因为它可以包含其他对象,一个容器中的所有对象都必须是同一种类型的。
-vector是一个类模板,使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型。
-和其他变量一样,定义vector对象要指定和一个变量列表。
具体如下:
vector<int> ivec; //该类型即是含有若干int类型对象,变量名为ivec
vector对象的定义和初始化
- vector对象的定义和初始化
下面介绍几种初始化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对象的操作
-vector标准库提供了许多类似string对象的操作
-如对size和empty的操作跟string类型一样的
向vector添加元素
用以下代码来说明:
string word;
vector<string>text;
while(cin>>word){
text.push_back(word);
}
-上述代码中 text.push_back(word)是vector对象text引用push_bacd()函数,这个操作的作用是为vector添加元素,添加到vector对象的后面。
vector的下标操作
跟string类型类似,用size_type类型作为vector下标类型:
for(vector<int>::size_typeix=0;ix!=str.size();++ix)
ivec[ix]=0;
-警告:下标操作不添加元素,仅能对确定存在的元素进行下标操作。
3.4
迭代器简介
-迭代器是一种检查容器内元素并遍历元素的数据类型
-它可以代替下标操作来访问元素,并且比下标操作跟通用,所有标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。
容器的iterator类型
如vector:
vector<int>::iteratoriter;//定义名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。
关于术语:迭代器和迭代器类型
-重要理解:若一种类型支持一组确定的操作(这些操作可用来遍历容器内的元素,并访问这些元素的值),我们就称这种类型为迭代器。
begin和end操作
-这两个操作用来返回迭代器
vector<int>::iteratoriter=ivec.begin();
-用begin操作返回迭代器指向的第一个元素,end操作来返回迭代器指向的最后一个元素的下一个元素(称为超出末端迭代器)
const_iterator
-每种容器类型还定义const_iterator的类型,该类型只能用于读取容器内的元素,但不能改变其值。
-当对const_iterator类型进行解引用(*),返回的是一个const值,不允许用const_iterator进行赋值。
-使用const_iterator类型时,它自身的值可以改变,但不能用来改变其所指向的元素的值。
-可以对迭代器进行自增以及使用解引用操作符来读值,但不能对该元素值赋值。
-注意:不要把const_iterator对象与const的iterator对象混淆。
-const迭代器几乎没什么作用,因为一旦它初始化,只能用它来改写其指向的元素,而不能使它指向任何元素。
3.5
标准库bitset类型
-提供bitset类型是用来处理二进制位的有序集的。
-bitset也是一种类模板,但与vector的区别仅在其长度而不在其类型。
-在定义bitset时,要明确bitset含有多少位,须在尖括号内给出长度值:
bitset<32>bitvec; //bitvec被定义为含有32位的bitset对象
初始化bitset对象的方法
bitset<n>b; //对象b有n为位,每位为0
bitset<n> b(u); //b是unsignedlong型u的一个副本
bitset<n> b(s); //b是string对象s中含有位串的副本
bitset<n> b(s,pos,n);//b是s中从位置pos开始的n个位的副本
-当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式。
十六进制值0xffff表示为二进制位就是十六个1和十六个0
//bitvec1 的长度小于初始化值
bitset<16>bitvec1(0xffff); //0~15位被设置为1
//bitvec2的长度和unsigned long相同
bitset<32>bitvec2(0xffff); //0~15位设置为1,1~31位设置为0
//bitset3的长度大于usigned long
bitset<128>bitvec3(0xffff); //位32到127被初始化为0
当用string对象初始化bitset对象时,string对象直接表示为为模式。从string对象读入位集的顺序是从右向左:
string strval(“1100”);
bitset<32>bitvec4(strval);
//bitvec4的位模式中第2和3位置为1,其余位置都为0.
-注解:string对象和bitset对象之间是反向转化:string对象的最右边字符用来初始化bitset对象的低阶位。
bitset对象上的操作
-用来测试或设置bitset对象中的单个或多个二进制位。
-count操作的返回类型是标准库中命名为size_t的类型
-bitset的size操作返回bitset对象中二进制位的个数,返回值是size_t的类型
-具体操作内容易理解就不做太多摘录
总结:本章介绍了三种标准库类型,一个是string类型、vector类型和bitset类型,这三种类型有很多类似之处,我觉得只要理解了其中的一种类型的基本概念和具体操作,然后对三种类型进行联系,也许就不会混淆,这一章简单简介了容器和迭代器,我对它们有了一定的了解,C++发展的趋势就是不断人性化,学习以最简洁最易理解的方式来编写程序,不断简化程序,减少代码的编辑量,我想自己走的就是这样的方向。
分享到:
相关推荐
C++Primer中文第三版(C++从入门到精通)第一章的读书笔记,主要是C++程序、预处理器指示符、iostream库等的基础知识点读书笔记。
第三章 标准库类型 13 第四章 数组和指针 21 第五章 表达式 31 第六章 语句 37 第七章 函数 37 第八章 标准IO库 37 第九章 顺序容器 43 第十章 关联容器 60 第十一章 泛型算法 75 第十二章 类和数据抽象 86 第十三章...
C++primer的笔记,可以看一下,一些容易犯错的陷阱
第3章 标准库类型 67 3.1 命名空间的using声明 68 3.2 标准库string类型 70 3.2.1 string对象的定义和初始化 70 3.2.2 String对象的读写 71 3.2.3 string对象的操作 72 3.2.4 string对象中字符的处理 76 3.3 标准库...
C++ primer plus 第五版的个人学习笔记,仅供大家学习参考。
C++Primer摘记,还不错.是第四版的
c++primer第五版中文版课后答案(第17章)pdf格式,真正的c++primer习题集(第五版),用手机拍的,但是每个字都能看的很清楚
c++primer第五版中文版课后答案(第12章)pdf格式,真正的c++primer习题集(第五版),用手机拍的,但是每个字都能看的很清楚
c++primer第五版中文版课后答案(第13章)pdf格式,真正的c++primer习题集(第五版),用手机拍的,但是每个字都能看的很清楚
C++Primer课后习题解答(第1~16章完整答案)清晰完整版
c++ primer plus 答案c++ primer plus 答案c++ primer plus 答案c++ primer plus 答案 c++ primer plus 答案
《C++ Primer Plus第6版中文版》学习笔记(第十章) 红字内容是有疑问或者没把握的。 绿字部分是比较重要,或者经过确认的
也如此,Standely Lippman 和 Josee Lajoie所著的畅销书《C++ Primer 3/e》中出现了许多问题,用来协助C++ 程序员获得实际经验,并能更深刻地了解这一语言的复杂度。 但是当其中的某些习题阻挡了你的进步时,你将...
C++primer第五版第二章习题答案.pdf
第3 章字符串、向量和数组..............................................37 练习3.1 练 习3.45 第4 章表达式......................................................... 80 练习4.1 练 习4.38 第5 章语句...........
经典之作c++ primer,笔记有助于学习总结
C++ Primer 第三版 Edition 中文完美版 其实第四版没有第三版讲解的精彩,所以建议选择第三版,有助于提高
C++primer 课后答案,习题对帮助记忆、理解很重要。内容高清,全面,带有书签,
C++ Primer 第5版 课后标准答案,全部章节课后答案都有。
此文件是c++primer 第三版的答案。非扫描版本的,值得你们下载