字符串与向量

string

初始化string的一些方法:

1
2
3
string s3="hiya";//s3是字面值的副本
string s4(10,'c');//s4的内容是ccccccccccc
string s2(s1);//s2是s1的副本

使用=执行的是拷贝初始化,而反之则是直接初始化

getline函数的参数是一个输入流和一个string对象,函数从输入流中读取直到遇到换行符为止(换行符也被读入),但是string中不会存换行符。

string.size()函数返回的是一个string::size_type类型的值,这个值是无符号整形数,因此不能直接与一个带负值的int作比较,例如s.size()<n这样,因为负值n会自动转换为一个比较大的无符号值,结果肯定是true.

string比较大小

按照大小写敏感的字典序比较;
2个注意点:
1.如果2个string对象长度不同且较短的对象的每个字符都与较长的string对应位置相等的话,那么较短的string小于较长的string。
2.如果2个字符串不完全相同,那么比较的结果其实是第一对相异字符的比较结果。

注意:字符串字面值与string并不是同一种类型!因此当把string对象与字符/字符串字面值混在一个语句中使用时,应该保证+左右两侧至少有一个是string。
例如:

1
2
3
4
string s3=s1+','+s2+'\n';
string s5="hello"+",";//错误
string s6=s1+","+"world";//正确,左边两个先相加依然是一个string
string s7="hello"+","+s2;//错误!左边两个都不是string

vector

vector初始化的几种方法:

1
2
3
4
5
vector<T>v2(v1);//v2有v1中所有元素的副本
Vector<T>v2=v1;
vector<T>v3(n,val);//v3包含了n个重复元素,每个都是val
vector<T>v4(n);//v4包含了n个重复的执行了默认值初始化的对象,一般来说int为0,string为空
vector<T>v5{a,b,c,d,e...};//列表初始化,注意一定要使用花括号

通过圆括号与花括号的区别区分初始化的意义

例子:

1
2
3
4
vector<int>v1(10);//v1有10个元素,每个的值都是0
vector<int>v2{10};//v2有一个元素,该元素值为10
vector<int>v3(10,1);//v3有10个元素,每个值都为1
vector<int>v4{10,1};//v4有2个元素,分别为10,1

一般来说,花括号就意味着列表初始化,但是如果确认了无法执行列表初始化以后,编译器就会尝试用默认值初始化vector对象。例如:

1
vector<string>v7{10};//v7有10个默认初始化的元素

vector对象的下标运算符可用于访问已存在的元素而不能用来添加元素
使用了迭代器的循环体,都不要向迭代器所属容器添加元素,否则会造成迭代器失效!