一、标准库string
表示可变长的字符序列
1、string对象的初始化
使用等号是拷贝初始化,不使用等号是直接初始化。
2、string对象操作
(1)读写操作:
iostream读string对象时,会自动忽略前面的空白,从第一个字符开始读起,直到遇见下一处空白;
读入一整行可以用getline,不会忽略中间的空格。
(2)size:
size返回的是size_type类型,是一个无符号类型。
(3)比较运算符:
如果两个string对象某些位置不一样,则比较的是第一对相异字符的字典序
3、处理字符
(1)遍历string中的每个字符:
string word("123456");
for(auto i : word){
cout << i << " " ;
}
(2)改变string中的字符:必须把循环变量定义成引用类型
string word("123456");
for(auto &i : word){
i = '1';
cout << i << " " ;
}
4、string与C风格字符串的转化:
(1)可以用char*初始化string
char*s1 = "1212121";
string s2 = s1;
(2)不能用string初始化char*,需要使用cstr成员函数,因为返回的对象是指针类型,因此必须初始化常量
const char*s1 ;
string s2 = "1212121";
s1 = s2.c_str(); //s1必须是常量
二、标准库Vector
1、定义初始化Vector
列表初始化:用花括号括起的0个或多个元素被赋给vector对象
如果花括号括起来的不能用来初始化,则尝试默认初始化
vector<string> ar = {"1","2","3"}; //必须使用花括号
值初始化:使用圆括号
vector<int> v1(10); //v1包含10个元素,每个元素都是0
vector<int> v2(10,1); //v2包含10个元素,每个元素都是1
2、向vector中添加元素
可以在运行时用成员函数push_back向vector中添加元素,定义vector对象时设定其大小没有什么意义。
三、迭代器
1、begin和end
如果容器为空,则begin和end返回的是同一个迭代器,因此可以用begin和end返回的是否是同一个结果来检查容器是否为空
if(s.begin!=s.end) //检验容器是否为空
begin和end返回的具体类型由对象是否是常量决定,如果是常量,返回const_iterator;如果不是常量,返回iterator。
C++ 11提供了cbegin和cend用来专门返回常量。
2、解引用迭代器
如果解引用的对象是个类,若想通过解引用访问类内成员需要加上圆括号
(*it).item;
it->item; //箭头可以简化写法
3、vector对象操作可能使迭代器失效
4、迭代器运算
(1)迭代器加上或减去一个数仍然是迭代器
(2)两个迭代器相减得到的是二者的距离
(3)关系运算符>,<等,根据位置前后进行比较,比较的两个迭代器必须指向同一个容器中的元素,类型是different_type,带符号整型数
四、数组
1、数组名和指针的关系
编译器一般会把数组名等效为指针,但是在某些情况下不成立P162:
(1)使用数组名作为decltype的表达式,返回的类型是数组 ;而auto则是指针
(2)a是数组名,sizeof(a)
(3)a是数组名,&a是int (*)[4]类型,即指向含有四个整型量的数组的指针
2、begin和end
C++ 11新标准,可以用begin和end返回数组首元素和尾元素的下一位置
int a[] = {1,2,3,4};
auto m = begin(a);
3、用数组来初始化vector
vector不能用来初始化数组,但数组可以用来初始化vector
char s1[] = "1212121";
vector<char> s3 (begin(s1),end(s1));