您的位置:首页 > 编程语言 > C语言/C++

再探C++Primer(6) 标准库类型string、vector和迭代器

2016-07-08 00:00 337 查看
摘要: 除内置类型外,C++还定义了一套标准库类型,来表达丰富的抽象数据结构。其中string和vector是我们常用的标准库类型,迭代器则是对这些容器的辅助操作。

###string#

使用string类需包含 string 头文件(旧C风格库中为string.h),string定义于命名空间std中(旧风格不是)。

#include<string>
using std::string;

string的初始化方式:

string s1;					//默认初始化,s1为空
string s2(s1);				//拷贝初始化,s2为s1的副本
string s3("hello");			//传参初始化,s3为"hello"串,不包含最后的'\0'
string s3 = "hello";		//等价于s3("hello"),实现方式不同
string s4(n,'c');			//把s4赋值为连续n个字符'c'组成的字符串

对string对象的操作:

os << s
is >> s						//输入输出流
getline(is, s)				//从is中读取一行给s
s.empty()					//判断s是否为空,为空返回true
s.size()					//返回s中字符个数
s
//访问s中第n个字符
s1 + s2						//返回s1和s2连接后的结果,每个+两侧必须有一个string对象
s1 = s2						//用s2的副本替代s1
s1 == s2					//若s1和s2中所有字符全部一样,则为true
s1 != s2
<, <=, >, >=				//利用字典序对字符进行比较,且对大小写敏感

同char数组不同的是,string在C++11以前的标准中并没有规定必须以'\0'结尾,所以不同的编译器有不同的实现规则,而C++11已经规定必须以'\0'结尾了。

处理string对象中的字符:cctype头文件中定义了一组标准库函数处理字符

isalnum(c)					//当c为字母或数字为真
isalpha(c)					//当c为字母时为真
iscntrl(c)					//当c为控制字符为真
isdigit(c)					//当c为数字为真
isgraph(c)					//当c不为空格但可打印时为真
islower(c)					//当c是小写字母为真
isprint(c)					//当c是可打印字符为真
ispunct(c)					//当c是标点符号时为真
isspace(c)					//当c是空白(空格,制表符..)时为真
isupper(c)					//当c是大写字母为真
isxdigit(c)					//当c是16进制数字为真
tolower(c)					//如果c为大写则转变为小写输出,否则原样输出
toupper(c)					//如果c为小写则转变为大写输出,否则原样输出

###vector#

vector又被称为容器,表示对象的集合,vector属于一种类模版,模板本身并不是类或者对象,编译器根据模板来创建类或者函数,称为实例化。vector定义于vector头文件和std命名空间。

#include<vector>
using std::vector;

通过提供信息来指明容器实例化为什么样的类:

vector<int> a;				//a保存int类型的对象
vector<S>	b;				//b保存S类型的对象
vector<vector<string>>	c;	//c保存vector<string>类型的对象

过去vector的嵌套需要在内层和外曾的'>'之间加一个空格,C++11不需要了。

vector的初始化:

vector<T>	a				//a为空vector,其潜在元素是T类型的,默认初始化
vector<T>	b(a)			//b中包含a中所有元素的副本
vector<T>	b = a			//同上
vector<T>	c(n,v)			//c中包含了n个元素,每个元素都是v
vector<T>	d(n)			//d中包含了n个执行了默认初始化的T对象
vector<T>	e{x,y,z...}		//e中包含了初始值个数的元素,每个元素都被赋初值
vector<T>	f={x,y,z...}	//f同e

vector操作索引:

v.empty()					//如果v为空则为真
v.size()					//返回v中元素个数
v.push_back(t)				//将t加入队尾
v
//返回v中第n个位置上的元素
v1 = v2						//用v2中元素的拷贝替换v1的元素
v1 = {x,y,z...}				//用列表中元素拷贝替换v1的元素
v1 == v2 					//v1同v2元素数量相同且元素对应位置相同
v1 != v2
<, <=, >, >=				//当v1、v2中元素可比时,字典序比较

vector的实现方式为动态数组,所以其随机访问的时间复杂度为O(1),队尾push和pop的时间复杂度为O(1),不支持随机添加修改删除,自己写的话时间复杂度为O(n)。

vector和string一样,其size()返回的并不是int而是一个size_type类型的值,是一个无符号整型。

###迭代器#

迭代器是string和容器的辅助标准库类,实现了对string和容器的访问。迭代器同指针一样,有效迭代器指向某个元素或容器中尾元素的下一个位置,其他情况都属于无效。

有迭代器的类型通过begin()方法返回第一个元素,end()方法返回尾元素的下一个位置。

auto b = v.begin();			//begin返回v的第一个元素
auto c = v.end();			//end返回v的最后一个元素的下一个位置

如果v为空,则begin和end都返回v的尾后位置。

迭代器运算符:

*iter						//返回迭代器iter所指元素
iter->mem					//等同于(*iter).mem
++iter						//令iter指向容器的下一个元素
--iter						//令iter指向容器的上一个元素
iter1 == iter2				//如果两个迭代器指向同一元素或为同一尾后迭代器,则相等
iter1 != iter2

string和vector迭代器提供了更多的运算符:

iter + n
iter - n
iter += n
iter -= n
iter1 - iter2				//计算两个迭代器之间的距离
//参与比较的两个迭代器必须指向同一容器中元素或尾元素下一位置
>, >=, <, <=                //比较操作比较迭代器在容器中的位置,顺序为升序
//参与比较的两个迭代器必须指向同一容器中元素或尾元素下一位置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ string vector 迭代器