string:
string是标准库类型,表示可变长的字符序列(个人把他看做特殊的vector<char>)
初始化string对象的几种方式:
string s1; //默认初始化,s1是一个空串 string s2 = s1; //拷贝初始化,调用拷贝赋值函数 string s2(s1); //直接初始化。调用构造函数 string s3(10,'c'); //直接初始化,s3含有连续10个c string s4 = "hello"; //使用字符串字面值初始化string对象,s4中不包含字符串字面值的最后一个空字符 string s4 = ("hello"); //
IO操作符读取string对象:
在使用IO操作符来读取string对象时,string对象会忽略开头(不止第一个)的空白(空格、换行、制表符等),从第一个真正的字符开始读起,知道遇到下一处空白为止。
string的getline函数:
getline函数的对象是一个输入流和一个string对象,getline()会将换行符读入输入流,但不会将换行符存入string对象。getline()是有返回值的,返回的是他的输入流参数
string::size_type类型:
string的size()的返回值的类型就是string::size_type,他是一个无符号整型数。
string对象的比较:
1.如果两个string对象的长度不同,且较短的每个字符都与较长的string对象的对应位置上的字符相同,则 短<长。
2.如果两个string对象在某些对应的位置上不一致,则string对象实际上比较的是第一对相异字符。
3.string对象的比较大小写敏感,按照字典顺序(ASCII)
字面值和string相加:
书上说标准库允许把字符字面值和字符串字面值转换为string对象。
每个加法运算符都必须有一个运算对象是string。
下标运算符[ ]:
string的下标运算符接受的参数是string::size_type类型,该参数表示要访问的字符的位置,返回值是该位置上的引用。
下标运算符只可以访问存在元素的位置(索引必须大于等于0小于s.size())
可以使用下标运算符修改字符的值。
可以使用下标运算符进行随即访问。
vector:
vector是标准库定义的一种类模板,来表示对象的集合。
老版本的C++ 中,如果vector的元素还是一个vector,则必须在外层vector的右侧尖括号的左侧加一个空格:vector<vector<int> >。
定义和初始化vector对象:
vector<T> v1; //默认初始化 vector<T> v2(v1); //直接初始化 vector<T> v2 = v1; //拷贝初始化 vector<T> v3(n,val); //n个val vector<T> v4(n); //n个值初始化的T类型 vector<T> v5{a,b,c…}; //个人觉得是每个值都执行一次直接初始化 vector<T> v5 = {a,b,c…}; //拷贝初始化
在使用花括号来初始化vector对象时,初始化过程会尽可能的把花括号内的值当作是元素初始值的列表来处理,只有在无法执行列表初始化时才会考虑其他初始化方式。:
vecctor<string> vec{10,"hi"} //vec有十个值为“hi”的元素
向vector对象中添加元素:
使用push_back(),要注意的是,范围for语句体内不应改变其所遍历的序列的大小。
vector中与string一样不能使用下标运算符添加元素。
迭代器:
目前在我看来,迭代器就是一个特殊的指针。
可以使用begin和end来获取容器的首元素迭代器和尾后迭代器(不可以对尾后迭代器解引用或运算操作)
空容器的begin和end返回的都是尾后迭代器。
大多数的迭代器都没有定义<运算符,所以尽量使用!=。
类似指针,迭代器也有常量类型。只有const_iterator可以在const容器中使用。
改变vector对象容量的操作,会使迭代器失效。
没有定义iterator+iterator的操作。