第3章 字符串、向量和数组
3.1 命名空间的using声明
using namespace::name
3.2.1 定义和初始化string对象
#include<string>
using std::string;
string s1; //默认初始化
string s2(s1); //直接初始化,s2为s1的副本
string s3=s1; //拷贝初始化,s3为s1的副本
string s4("value"); //直接初始化,
string s5="value"; //拷贝初始化,
string s6(n,'c'); //拷贝初始化,将s6初始化为有连续n个字符c组成的串
3.2.2 string对象上的操作
os<<s //将s写到输出流os中,返回os
is>>s //从is中读取字符串付给s,返回s
getline(is,s) //从is中读取一行赋给s,返回is
s.empty() //s为空返回true,否则返回false
s.size() //返回s中字符的个数,返回的值是string::size_type类型
s[n] //返回s中第n个字符的引用,位置n从0计起
s1+s2 //返回s1和s2连接后的结果
s1=s2
s1==s2
s1!=s2
<,<=,>,>=
- 字面值和string对象相加必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string。
string s2=s1+", "; //正确
string s3="hello"+","; //错误
string s4="hello"+", "+s2; //错误
string s5=s1+", "+"world"; //正确
3.2.3 处理string对象中的字符
- 范围for语句
for(declaration:expression)
statement
//示例:
string str("some string");
for(auto c : str)
cout<<c<<endl;
2. 使用范围for语句如果想改变expression对象中的值,应把循环变量定义为引用类型。
3.3.1 定义和初始化vector对象
vector<string> v1{10}; //v1有10个默认初始化的元素
vector<string> v2{10,"hi"}; //v2有10个值为“hi”的元素
3.4迭代器介绍
- 迭代器类型iterator和const_iterator.
vector<int>::iterator it; //it能读写vector<int>元素
string::iterator it2; //it2能读写string对象中的字符
vector<int>::const_iterator it3; //it3只能读
string::const_iterator it4; //it4只能读
2. begin和end运算符对应iterator,cbegin和cend对应const_iterator。
3.5 数组
unsigned cnt=42;
string bad[cnt]; //错误:cnt不是常量表达式
- 定义数组的时候必须指定数组的类型,不允许用auto关键字由初始值的列表推断类型,另外和vector一样,数组的元素应为对象,因此不存在引用的数组
- 不能将数组的内容拷贝给其他数组作为其初始值。
int a[]={0,1,2};
int a1[]=a; //错误:不允许使用一个数组初始化另一个数组
a1=a; //错误:不能把一个数组直接赋值给另一个数组
int (*Parray)[10]=&arr; //Parray指向一个含有10个整数的数组
int (&arrRef)[10]=arr; //arrRef引用一个含有10个整数的数组
int *(&arry)[10]=ptrs; //arry是数组的引用,该数组含有10个指针
auto ia(a); //ia是一个指针,指向a的第一个元素
decltype(a) ia1 = {1,2,3}; //ia1是一个含有3个整数的数组
3. 要想理解数组声明的含义,最好的办法是从数组的名字开始按照由内向外的顺序阅读。
3.6 多维数组
- 要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。如果不采用引用的方式则会将row转换为指向该数组内部首元素的指针。
for(const suto &row : ia)
for(auto col : row)
cout<<col<<endl;