在这一章里面主要分几个部分命名空间using,标准库类型string,vector,迭代器的简单介绍,数组等
3.1命名空间的using声明
在c++中通常使用using namespace std
3.2标准库类型string
标准库类型string表示可变长的字符序列,使用string类型须包含strirng头文件
定义和初始化string对象
string s1; //默认初始化,s1是一个空串
string s2(s1); //直接初始化,s2是s1的副本
string s2=s1; //拷贝初始化,s2是s1的副本
string s3("value"); //直接初始化,s3是"value"的副本,除了最后的空字符
string s3="value"; //拷贝初始化
string s4(10,'c'); //直接初始化,s4初始化之后的内容是cccccccccc
string s5 = string(10,'c'); //拷贝初始化,s5的内容是cccccccccc
string的操作
内容 | 说明 |
---|---|
getlin(is ,s) | 从is中读取一行赋值给s,返回is |
s.empty() | s为空为true,否则flase |
s.size() | 返回s中字符的个数 |
s[n] | 返回第n个字符的引用,位置从0开始 |
s1+s2 | 返回s1和s2连接的结果 |
s1=s2 | 用s2的副本代替s1中的内容 |
s1==s2 | s1和s2中字符完全一样则相等,对大小写敏感 |
s1!=s2 | 判断不相等,对大小写敏感 |
<,>,>=,<= | 字符在字典中的顺序进行比较,对大小写敏感 |
string注意点
其实这只是我自己的笔记
1.定义string时,string对象会自动忽略开头空白,并从第一个字符真正的字符开始读起,直到遇见下一个空白
2.getline是读取一整行,包括空白,遇到换行符为止,换行符也被读进来了,但是不保存到string对象中去
3.每个加法运算符的两侧运算对象至少有一个是string
string s1="hello";
string s2=s1+'world'; //正确:有一个string对象
string s5="hello"+"world"; //错误:两个运算对象都不是string
3.3标准库类型vector
标准库类型vector表示对象的集合,其中所有对象的类型都相同
定义和初始化vector对象
vector<T> v1; //v1是一个空vector,潜在的元素是T类型,默认初始化
vector<T> v2(v1); //v2中含有v1所有元素的副本
vector<T> v2=v1; //和v2(v1)等价
vector<T> v3(n,val); //v3中包含了个重复的元素,每个重复元素的值是val
vector<T> v4(n); //v4中包含了n个重复地执行了值初始化的对象
vector<T> v5{a,b,c...}; //列表初始化:v5包含了初始值个数的元素,每个元素被赋予相应的初始值
vector<T> v5={a,b,c...}; //和上面等价
vector是个类模板,编译器根据模板创建类或函数的过程称为实例化,当使用模板时,需要指出编译器应该把类或者函数实例化成什么类型。
如果用的圆括号可以说提供的值是用来构造对象,如果用的是花括号,可以表述成列表初始化,在无法列表初始化时也会进行其他初始化方式,如下:
vector<int> v1(10); //v1有10个元素,每个的值都是0
vector<int> v1{10}; //v2有一个元素,元素的值是10
vector<string> v3("hi"); //错误,不能用字符串构建vector对象
vector<string> v4{10,"hi"}; //v8中有10个值为"hi"的元素
vector的操作
内容 | 描述 |
---|---|
v.empty() | 如果v中不含有任何元素,返回真,否则假 |
v.size | 返回v中元素个数 |
v.push_back(t) | 向v的尾端添加一个值为t的元素 |
v[n] | 返回v中第n个位置上的引用 |
其他的都和string差不多,不想写了。。。。。。
迭代器介绍
在前面介绍的string和vector中可以用for循环处理每个字符,方式是: string str("hello"); for(auto c:str){....}
我们通过auto关键字,让编译器决定c的类型,这里c的类型是char,每次迭代,str的下一个字符被拷贝给c,注意这里是c++11的标准,使用GUN编译器是要加上-std=C++11。
迭代器的成员一般是用两个begin和end,其中begin成员负责返回指向第一个元素的迭代器,end成员返回指向容器的最后一个元素的下一位置,迭代器运算符包括*iter
iter->men
(*iter).men
++iter
--iter
iter1==iter2
iter1!=iter2
。
迭代器的类型是iterator
const_iterator
在现代c++程序中应该尽量用vector和迭代器,,避免使用内置数组和指针,应该尽量使用string,避免使用c风格的字符串
所以数组的知识这里就不介绍了
我个人比较感兴趣的是c++11数组也引入了begin和end,使用方法是将数组作为参数
int ia[]={0,1,2,3,4,5};
int *beg=begin(ia); //指向ia首元素的指针
int *last=end(ia); //指向arr尾元素的下一位置的指针