再探C++Primer(6) 标准库类型string、vector和迭代器
2016-07-08 00:00
337 查看
摘要: 除内置类型外,C++还定义了一套标准库类型,来表达丰富的抽象数据结构。其中string和vector是我们常用的标准库类型,迭代器则是对这些容器的辅助操作。
###string#
使用string类需包含 string 头文件(旧C风格库中为string.h),string定义于命名空间std中(旧风格不是)。
string的初始化方式:
对string对象的操作:
同char数组不同的是,string在C++11以前的标准中并没有规定必须以'\0'结尾,所以不同的编译器有不同的实现规则,而C++11已经规定必须以'\0'结尾了。
处理string对象中的字符:cctype头文件中定义了一组标准库函数处理字符
###vector#
vector又被称为容器,表示对象的集合,vector属于一种类模版,模板本身并不是类或者对象,编译器根据模板来创建类或者函数,称为实例化。vector定义于vector头文件和std命名空间。
通过提供信息来指明容器实例化为什么样的类:
过去vector的嵌套需要在内层和外曾的'>'之间加一个空格,C++11不需要了。
vector的初始化:
vector操作索引:
vector的实现方式为动态数组,所以其随机访问的时间复杂度为O(1),队尾push和pop的时间复杂度为O(1),不支持随机添加修改删除,自己写的话时间复杂度为O(n)。
vector和string一样,其size()返回的并不是int而是一个size_type类型的值,是一个无符号整型。
###迭代器#
迭代器是string和容器的辅助标准库类,实现了对string和容器的访问。迭代器同指针一样,有效迭代器指向某个元素或容器中尾元素的下一个位置,其他情况都属于无效。
有迭代器的类型通过begin()方法返回第一个元素,end()方法返回尾元素的下一个位置。
如果v为空,则begin和end都返回v的尾后位置。
迭代器运算符:
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++实现JNI接口需要注意的事项
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android java 与 javascript互访(相互调用)的方法例子
- 关于指针的一些事情
- 设计模式之行为型模式 - 调用行为的传递问题
- android上改变listView的选中颜色
- String.intern
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- Ruby中的迭代器详解
- Ruby中Block和迭代器的使用讲解
- Lua中调用C++函数示例
- Lua中的迭代器浅析
- Lua中的迭代器和泛型for介绍
- Lua教程(一):在C++中嵌入Lua脚本
- 深入解读Lua中迭代器与泛型for的使用
- Lua教程(二):C++和Lua相互传递数据示例