C++ Primer笔记(二)标准库类型

1、一个using声明一次只能作用于一个命名空间成员。在头文件中放置using声明,就相当于在包含该头文件的每个程序中都放置了同一using声明。

在头文件中,必须总是使用完全限定的标准库名字。因为头文件的内容会被预处理器复制到程序中。通常,头文件中应该只定义确实必要的东西。即最小权原则。

2、string支持长度可变的字符串。使用string类型对象时必须包含头文件<string>。  

string是定义在std名字空间的名字。

string标准库支持几个构造函数,定义如何初始化该类型的对象。

string s1;    //默认构造函数,s1为空串。

string s2(s1);    //将s2初始化为s1的一个副本。

string s3("value");   //将s3初始化为一个字符串字面值副本。

string s4(n, 'c');     //将s4初始化为字符'c'大的n个副本。


3、string类型的输入操作符:

1)读取并忽略开头所有的空白字符(如空格、换行符、制表符)。

2)读取字符直至再次遇到空白字符,读取终止。


4、getline读取整行文本,接收两个参数:一个输入流对象和一个string对象。其遇到换行符停止,但不包括换行符。

5、string成员函数size()返回的是string::size_type类型。它被称为配套类型。

成员函数empty( )返回bool值,如果string对象为空则返回true,否则返回false。

通过这些配套类型可以实现库类型的使用与机器无关。它被定义为与unsigned有相同的含义,可以保证足够大,能够存储任意长度的string对象。


6、因此任何存储string的size()返回结果的变量必须为string::size_type类型。

注意:不要把size的返回结果赋给int类型的变量。因为在有些机器上int类型表示范围很小,如16位的int类型的变量最大只能表示32767个字符。使用size_type是最安全的方法。

string st1 = , st2 = "abcdefg";

st1 = st2;

将一字符串直接赋值给st2,调用的是复制构造函数,且单参构造函数执行了隐式转换。


7、string对象区分大小写。任何一个大写字母都小于任意的小写字母。

==操作比较两个string对象,如果它们长度相等且含有相同的字符,即为相等。

其他:!=是否不等。关系操作符<, <=, >, >=。



8、string对象的加法并定义为连接。
将string类型的对象与字符串进行混合操作时,如string s1("abc");  string s2=s2+"def";  

+左右操作数必须至少有一个是string类型的。如string s2=s1+" , "+"!!"; 

之所以可以级联操作,因为它和cout及cin是一样的,s1+","将返回一个新的string对象。

String s3=","+"!!"+s2;这句是错的。因为第一个+运算符两边均是字符串,这是不允许的。


9、string类型通过下标操作符[ ]来访问string对象中的单个字符。[ ]需要取一个size_type类型的值,来标明方访问字符的位置,即索引。注意:string对象的下标从0开始。

标准库不要求检查索引值,所用索引的下标越界是没有定义的。


10、vector是一个类模板,它可以定义任意多种数据类型,但它不是一种数据类型。vector<int>是数据类型。

对于vector保存内置类型的元素,标准库将用0值初始化所有的成员。

如vector<int> vec(10);   //10个int类型的成员初始值均为0;

如果保存的是类类型,标准库将调用类的默认构造函数来初始化每一个元素。如果类中定义了构造函数,但没有提供默认构造函数,初始化这种类型的vector对象时,除了提供vector对象所含的元素个数之外,还必须指定每个元素的初始值。



11、vector的size返回相应的vector定义的size_type的值。

但vector::size_type是不正确的,必须指明该类型是在哪里定义的。

如vector<int>::size_type;//正确


12、除了使用下标来访问vector对象元素外,还可以使用迭代器来访问。

之所以为所有的标准库容器都定义了相应的迭代器类型,是因为只有少数的容器支持下表操作。迭代器是通用化的方法。每种容器都定义了自己的迭代器类型。

如vector<int>::iterator iter;


13、begin()返回vector的开始元素,end()返回vector末端元素的下一个,它不指向任何元素。通常被称为超出末端。若vector为空begin()和end()返回的迭代器相同。

for(vector<int>::iterator iter=vec.begin();iter!=vec.end();iter++);

对于此句判断iter是否指向vector容器的末尾,使用的是!=符号,而不是常使用的<符号。


14、iter++,是iter指向容器中的下一个元素,与指针类似。

之所以每次判断是都调用end(),而不在循环开始之前就获得,是因为循环内可能会增加或删除容器的元素,一旦发生此情况迭代器就会失效,很可能导致死循环。


15、const_interator与interator类似,只是它无法改变引用的元素的值,仅仅能读取。

注意const vector<int>::iterator,此迭代器无法通过自增自减改变指向。仅仅可以改变它指向的元素的值。与const int *const p相联系可以加深理解 。


16、iter2-iter1,两迭代器相减得到两个迭代器之间元素的个数。

容器内定义了different_type类型来表示存储此变量的类型。实际就是signed类型。

Iter1+num,通过对迭代器增加或减少某个值,让迭代器直接指向某个元素。

如vector<int>::iterator iter=vec.begin()+vec.size()/2; //直接访问中间的元素。


17、任何改变vector长度的操作都会使已存在的迭代器失效。

例如在push_back之后就不能在依赖指向vector的迭代器的值了。


1、以双斜线符号开头的注释只对此行有效,因此称为单行注释。//

2、#include<iostream>是一个预处理命令,在程序被编译之前由预处理器来处理。

3、空白间隔符——空行、空格、制表符等。

4、c++程序从main函数开始执行,即使main函数并不是程序中的第一个函数。

5、串有时称为字符串或者字符串文字。

6、编译器不会忽略串中的空白间隔符。

7、std::cout指出了“名字空间”std中的一个名字,即cout。

8、<<运算符指向数据流动的方向。右操作数中的字符通常按照字符在双引号中的形式打印出来。

9、反斜线符号(\)称为转义字符,它表明一个特殊字符会被输出。

10、编译器是在编译过程中发现语法错误的,所有语法错误也称为编译器错误、编译时错误或编译错误。

11、按照C++标准,如果程序执行到main的末尾但没有遇到return语句,就会认为程序成功地终止了,就好像main的最后一条语句是包含值0的return语句那样,因此,return 0可以省略。

12、变量代表计算机内存中的一个特定区域,可以存储程序使用的一个值。变量的声明可以在程序的任意地方出现,但是必须在相应的变量被程序使用之前。多个变量既可以在一个语句中声明,也可以在多个语句中声明。

13、std::endl强制显示所有积存的输出。

14、应总是在一个声明和其他相邻的可执行语句之间放置一个空行。

15、求模运算符只能和整数操作数一起使用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值