string对象中的字符
范围for语句
For(declaration : expression)
Statement //Expression是对象
使用范围for语句改变字符串中的字符
下标运算符[ ]
访问string对象中的单个字符有俩种方式:
- 使用下标
- 使用迭代器
使用下标随机访问,都要检查其合法性,string对象的下标必须大于等于0而小于s.size()
标准库类型Vector
初始化vector对象
Vector<T>v2(v1) //v2中包含v1所有元素的副本
Vector<T>v2=v1 //等价于v2(v1)
Vector<T>v3(n,val) //v3包含n个重复元素,值为val
Vector<T>v4{a,b,c...} //包含初始值个数元素
Vector<T>v5={a,b,c...} //等价于v5{a,b,c...}
允许把一个vector对象的元素拷贝到另一个vector对象,此时,新vector对象是原vector对象的副本,注意俩个vector对象的类型必须相同。
值初始化
可以只提供vector对象容纳的元素数量而略去初值。此时库会创建一个值初始化的元素初值,并把它赋给容器中的所有元素。这个初值由vector对象的元素类型决定。
Vector<int> ivec(10); //10个元素,每个元素都初始化为0
Vector<string> svec(10); //10个元素,每个都是空string对象
Vector<int> ivec(10,-1); //10个元素,每个元素初始化为1
Vector<string> svec(10,”hi”); //10个元素,每个元素为”hi”
列表初始值还是元素数量?
一般通过花括号还是圆括号来区分是列表初始值还是元素数量
花括号:列表初始化该对象,初始化过程会尽可能的把花括号内的值当成元素初始值的列表来处理。
Vector<int> v1{10,1}; //v1有俩个元素,值分别是10,1
如果使用花括号的形式但提供的值又不能用来列表初始化,考虑用这样的值来构造vector对象。
Vector<string> v7{10}; //v7有十个默认初始化的元素
Vector<string> v8{10,”hi”}; //v8有十个值为hi的元素
即要看花括号内数值跟尖括号内的类型(尖括号是int,就是一个值,尖括号是string,就是有“数值”个默认初始化元素)
Vector<int> v2{10}; //v2有一个元素,为10
Vector<string> v9{10}; //v9有10个默认初始化的元素
圆括号:用提供的值来构造vector对象的
Vector<int> v3(10); //v3有10个元素,每个值都是0
Vector<int> v2(10,1); //v2有10个元素,每个值都是1
向vector对象添加元素
push_back: push_back负责把一个值当成vector对象的尾元素“压到(push)”vector对象的“尾端(back)”
vector<int> v2;
for(int i=0;i !=100;++i)
v2.push_back(i);//依次把整数值放到v2尾端 循环结束v2有100元素,0-99
注意:v1==v2 v1和v2相等当且仅当他们的元素数量相同并且对应位置的元素值都相同
如果循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环。
Vector的empty和size俩个成员与String的同名成员功能完全一致。
迭代器
begin 、 end函数
Begin:返回指向第一个元素
End:指向容器(或string对象)尾元素的下一位置。
如果容器为空,则begin和end返回统一迭代器,都是尾后迭代器。
注意:end返回的迭代器并不实际指向某个元素,所以不能对其进行递增或解引用的操作。
如string和vector的size_type成员到底是什么类型一样,一般来说我们也不知道(也无须知道)迭代器的精确类型。
const_iterator和常量指针差不多,如果vector对象或string对象不是常量,那么既能使用iterator也能使用const_iterator。
相应地,begin和end返回的具体类型由对象是否是常量决定,如果对象是常量,返回const_iterator;如果对象不是常量,返回iterator.
cbegin和cend函数
分别返回指示容器第一个元素或最后元素下一个位置的迭代器。不同的是,不论vector对象(或string对象)本身是否是常量,返回值都是const_iterator。为了便于对象的读操作而无需写操作引入。
箭头操作符
它把解引用和成员访问俩个操作结合在一起。也就是说:it->men = (*it).men
Vector对象的副作用
- 不能在范围for循环中向vector对象添加元素
- 任何一种可能改变vector对象容量的操作,如push_back,都会使该vector对象的迭代器失效。
迭代器的运算
Iter1-Iter2:俩个迭代器相减的结果是它们之间的距离
此距离我们用difference_type的带符号整型数表示,string和vector都定义了这个类型,因为这个距离可正可负,所以difference_type是带符号类型的。
c++并没有定义俩个迭代器的加法运算,没有意义。相反,定义了迭代器之间的减法运算,俩个迭代器相减的结果是它们之间的距离。也就是说,将运算符右侧的迭代器向前移动多少个元素后可以得到左侧的迭代器,参与运算的俩个迭代器必须指向同一容器中的元素或尾后元素。
此外,c++定义迭代器与整数的加减运算,用以控制迭代器在容器中左右移动。