除了第2章介绍的内置类型之外,C++语言还定义了一个内容丰富的抽象数据类型库。其中,string和vector是两种最重要的标准库类型,前者支持可变长字符串,后者则表示可变长的集合。还有-一种标准库类型是迭代器,它是string和vector的配套类型,常被用于访问stringg中的字符或vector中的元素。
内置数组是一种更 基础的类型,string 和vector都是对它的某种抽象。本章将分别介绍数组以及标准库类型string和vector.
第2章介绍的内置类型是由C++语言直接定义的。这些类型,比如数字和字符,体现了大多数计算机硬件本身具备的能力。标准库定义了另外组具有更高级性质的类型, 它们尚未直接实现到计算机硬件中。
本章将介绍两种最重要的标准库类型: string 和vector。string 表示可变长的字符序列,vector存放的是某种给定类型对象的可变长序列。本章还将介绍内置数组类型,和其他内置类型一样, 数组的实现与硬件密切相关。因此相较于标准库类型string和vector,数组在灵活性上稍显不足。
在开始介绍标准库类型之前,先来学习一种访问库中 名字的简单方法。
3.1命名空间的using声明
就像我们前面所学的,我们所用到的库函数基本都属于命名空间std的,每次使用时都要声明(std::),十分的麻烦,而使用using声明可以很轻松的解决这个问题,格式为:
using namespace::name
放在全局作用域中,之后就可以直接访问
#include <iostream>
// using声明,当我们使用名字cin时,从命名空间std中获取它using std: :cin;
int main ( )
{
int i;
cin >> i;
//正确:cin和std: :cin含义相同
cout<<i;
//错误:没有对应的using声明,必须使用完整的名字
std: :cout << i; //正确:显式地从std中使用cout
return 0;
}
你每想使用一个名字都必须进行声明,而且using声明之后只能跟一个名字,就是想一行多声明,也必须声明一个之后用分号隔开
头文件不应包含using声明
3.2 标准库类型string
相较于c语言,c++居然可以直接定义字符串类型,标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件,接下来的所以代码块中都将包含
#include<string>
using std::string;
除了本章要介绍的string的操作以外,9.5节也将介绍一部分
3.2.1 定义和初始化string对象
初始化string的方式
string sl //默认初始化,s1是一个空串
string s2 (s1 ) //s2是s1的副本
string s2 = s1 //等价于s2(s1),s2是s1的副本
string s3 ("value") //s3是字面值"value"的副本,除了字面值最后的那个空字符外
string s3 = "value" //等价于s3 ("value"),s3是字面值"value"的副本
string s4 (n, 'c') //把s4初始化为由连续n个字符C组成的串
直接初始化和拷贝初始化
拷贝初始化利用的是“=”号,相当于将等号右边的值拷贝给左边,而不利用等号,利用的是括号的是直接初始化
当初始值只有一个时, 使用直接初始化或拷贝初始化都行。如果像上面的s4那祥初始化要用到的值有多个,一 般来说只能使用直接初始化的方式:
string s5 = "hiya";//拷贝初始化
string s6("hiya") ;//直接初始化
string s7(10,'c') ;//直接初始化,s7的内容是cccccccccc
对于用多个值进行初始化的情况,非要用拷贝初始化的方式来处理也不是不可以,不过需要显式地创建一个 (临时) 对象用于拷贝:
string s8 = string(10, 'c'); // 拷贝初始化,s8的内容是 cccccccccc
s8的初始值是string(10, ‘c’ ),, 它实际上是用数字10和字符c两个参数创建出来的个string对象,然后这个string对象又拷贝给了s8.这条语句本质上等价于下面的两条语句:
string temp(10, 'c') ;// temp 的内容是cccccecccc
string s8 = temp;//将temp拷贝给s8