一、标准库类型string
1.string的初始化
string s1; //默认初始化,s1是一个空串 string s2(s1); //直接初始化,s2是s1的副本 string s2=s1; //拷贝初始化,s2是s1的副本 string s3(“value”); //直接初始化,s3是字面值“value”的副本 string s3=“value” //拷贝初始化,s3是字面值“value”的副本 string s4(n,’a’); //直接初始化,s4初始化为由连续n个字符a组成的串
2. getline函数读取整行文本,直到遇到换行符为止。
3. size函数返回string对象中字符的个数,返回值是一个string::size_type类型的值,它是无符号数。
4. 关系运算符<,<=,>,>=按字典顺序比较两个string对象的大小。
5. empty成员函数表示当string对象为空时返回true,否则返回false;
size成员函数表示返回string对象中字符的个数。
6.加法运算符的两次的运算对象至少有一个是string;
string s2 = s1 + ""; //正确 string s2 = "hello " + " world"; //错误
7. 用范围for操作string中的每个字符
string str("helloworld"); for(auto c:str) cout<<c<<endl;
8. 下标运算符接收的参数是string::size_type类型的值,返回值是该位置字符的引用
二、标准库类型vector
1. vector的初始化
vector<T> v1; //默认构造函数,初始化的v1为空vector vector<T> v2(v1); //将v1中的元素全部复制到v2中,v1中对象的类必须与v2的类相同 vector<T> v2=v1; //等价于vector<T> v2(v1) vector<T> v3(n); //v3含有n个重复执行了值初始化的对象 vector<T> v4(n, v); //v4含有n个值为v的元素 vector<T> v5{a,b,c…}; //v5包含了初始值个数的元素,每个元素被赋予相应的初始值 vector<T> v5={a,b,c…}; //等价于vector<T> v5{a,b,c…}
2.在上面第4种情况的初始化中,
如果vector对象的元素是内置类型,如int,则元素初始值自动设为0;
如果T为某种类类型并含有默认的构造函数,则T会被按照构造函数进行初始化;
如果不符合以上两种情况,在初始化vector时一定要指出如何初始化其中元素。
如果循环体内部包含有向vector对象添加元素的语句,则不能用范围for循环。
3. vector的empty和size两个成员函数和string的同名成员函数功能一致
三、迭代器
1. 每个标准库容器都会定义迭代器,用于遍历其中的每一个元素。begin成员函数负责指向第一个元素的迭代器,end函数负责指向尾元素的下一位置的迭代器,也就是该迭代器指向不存在的尾后元素
2. 迭代器类型
vector<int>::iterator it; //it能读写vector<int>的元素 vector<int>::const_iterator it; //it只能读vector<int>的元素
3. 迭代器运算
只要迭代器指向同一个容器中的元素或者尾元素的下一位置,就能相减,结果是迭代器的距离,类型是difference_type;
四、数组
1.数组不允许拷贝和赋值
int a[]={1,2,3}; int a2[]=a; //错误,不能用一个数组初始化另一个数组 a2=a //错误,不能把一个数组赋值给另一个数组
2. c++11引入两个名为begin和end函数
#include<iostream> using namespace std; int main(){ int ia[]={1,2,3,4,5,6,7,8}; int *pbeg=begin(ia);//指向ia首元素的指针 int *pend=end(ia);//指向ia尾元素的下一位置的指针 for(;pbeg!=pend;++pbeg) cout<<*pbeg<<" "; cout<<endl; system("pause"); return 0; }