chapter 3 字符串,向量和数组
类型是C++编程的基础,类型规定了对象的存储要求以及所能执行的操作,C++提供了一套基础内置类型,类型分为常量以及非常量,一个常量对象必须初始化,一旦初始化就不能再改变。此外可以重复定义复合变量。复合类型以其他的类型为基础。
编写自己的头文件:
类一般不定义在函数体内,在函数体外部使用类的时候,在各个指定的源文件中只有一处为类的定义,并且在不同文件中使用同一个类,类的定义必须保持一致。
类通常定义在头文件中,类所在头文件的名字应该和类的名字一样。
3.1 命名空间以及using声明
目前为止,用到的库函数基本都属于命名空间std;
每个名字都需要独立的using声明:
头文件不包含using声明:由于头文件中的内容可以copy 到其他文件中去。
3.2 标准库类型string
3.2.1 定义和初始化string 对象
直接初始化和copy初始化:string s2=s1;string s2(10,‘c‘);
3.2.2 string对象上的操作s.empty();s.size(); s[];s1+s2;s1=s2;s1==s2;s1!=s2;getline(is,s);os<<s;is>>s;
读写string对象: int main() {string s; cin>>s; cout<<s; return 0;} 读取的时候丛第一个字符开始到遇见下一个字符为止。
读取未知量的string对象:
使用getline读取一整行:getline(cin,line)字符串中将会保留输入时的空白符。
string 的empty和size操作:string 对象.empty();string对象.size();
string::size_type 类型:string 对象.size()返回的类型。
string类以及标准库类型定义了几种配套的类型。配套的类型体现了标准库类型和机器无关的特性。size_type 是其中的一种。
比较string对象:两点字符相同比较长度,长度不一定的情况下比较第一个相异字符。
为string对象赋值:在设计标准类库的时候要向内置类型看齐。
两个string对象相加:
字面值和string对象相加:必须保证每一个+ 两侧的运算对象至少要有一个是string。
3.2.3 处理string对象中的字符:
在cctype头文件中定义了一组标准库函数来改变某个字符的特征。
isalnum(c);isalpha();isdigit();isprint();iscntrl();isxdigit();isspace();toupper();tolower();isupper();islower();isgraph();ispunct();
如何处理每个字符? 使用for语句 for(declaration:expression) statement;
for语句可以遍历序列中的每个元素,并且对序列中的每个值执行相同的操作。
使用for语句改变字符串中的字符:如果改变一个string对象中的值,则必须把循环变量定义成为引用类型。
只处理string里的一部分字符:访问string对象里的字符有两种方法:1.使用下标2.使用迭代器
使用下标进行随机访问:e.g:输入一个十进制数,转换成为一个对应的十六进制数
3.3 标准库类型vector
vector 表示对象的集合,其中所有对象的类型都是一样的.
eg vector<int>ivec;
不存在包含引用的vector;
3.3.1 定义和初始化vector对象:
vector<T> v1;
vector<T> v2(v1)/v2=v1;
vector<T> v3(n,val);
vector<T>v4{a,b,c,d,......}
vector 支持copy;
列表初始化vector对象:vector<string> ivec{"a","an","the"};
创建制定数量的元素:
vector<int> ivec(10,-1);vector<string>(10,"hi");
值初始化:通常情况下,可以只提供vector对象容纳的元素数量而忽略初始值。此时库会创建一个值初始化的元素初值,赋给容器中的所有元素。
对于int内置类型来讲都置为0 ,string类型则默认初始化。
列表初始值还是元素数量?
圆括号是构造,不能用字符串字面值来构造vector对象。花括号是列表初始化;
当花括号中的元素不能用来列表初始化的时候,就要考虑用这种值来构造vector对象了。
3.3.2 向vector对象里面添加元素:
两种情况向vector对象里面添加元素:1.不符合初始化的条件(元素数量比较大)2.运行的时候才知道Vector里面元素的数目的时候
注:vextor初始化的条件:1.一个vector对象是另外一个vector对象的副本。2.元素数量都是相同的3.元素数量比较少,可以列表初始化。
C++标准程序库的定义:
C++中的标准程序库(简称标准库)是类库和函数的集合,其使用核心语言写成。标准程序库提供若干泛型容器、函数对象、泛型字符串和流(包含交互和文件I/O),支持部分语言特性和常用的函数,如开平方根。C++标准程序库也吸收了ISO C90 C标准程序库。标准程序库的特性声明于std命名空间之中。
标准模板程序库 (STL = Standard Template Library)是C++标准程序库的子集,包含容器、算法、迭代器、函数对象等。也有些人使用术语STL代表C++标准程序库。
vector的其他操作:
3.4 迭代器介绍:是一种类型用于访问容器中的元素以及在元素之间移动
3.4.1 使用迭代器:如果两个迭代器指向同一种元素或都是同一个容器的尾后迭代器则它们是相等的。
迭代器从一个元素移动到另外一个元素:for(auto it=s.b egin();it!=s.end()&&!isspace(*it);++it)
泛型编程:
迭代器类型:string::iterator it2;vector<int>::iterator it;iterator 的对象可读可写。
迭代器和迭代器类型
begin和end运算符: 返回的具体类型由对象是否是常量来决定。如果对象是常量那么返回的类型是const_iterator,如果对象不是常量那么返回的类型是iterator
c++ 11中规定的两个新函数cbegin和cend v.cend和v.cbegin都是返回指示容器的第一个和最后一个元素的迭代器。
结合解引用和成员访问操作:
某些对Vector对象的操作会是迭代器失效:
3.4.2 迭代器运算: