您的位置:首页 > 其它

Chapter3 字符串、向量和数组

2017-09-29 16:56 190 查看

字符串

字面值与string对象相加

1. 字符串字面值与string是不同的类型

2. 字面值与string类型对象相加时,必须确保每个加法运算符(+)的两侧至少有一个string对象

string str1 = "hello";
string str2 = str1 + "world";           //合法
string str3 = "hello" + "world";        //不合法
string str4 = str1 + "world" + "!";     //合法,str1 + "world" 返回了一个string,然后再与"!"加法运算


字符处理

cctype头文件函数参考

标准库类型 vector

vector的定义与初始化

vector 初始化有多种方法,下面将这些方法详细罗列

vector<T> v1;               //定义了一个空vector,潜在元素是T类型,执行默认初始化

vector<T> v2(v1);           //v2是v1的拷贝
vector<T> v2 = v1;          //同上

vector<T> v3(n,val);        //v3包含n个重复的元素,每个的值都是val
vector<T> v4(n);            //v4包含n个重复的元素,每个的值都是默认初始化的(通常是0)

vector<T> v5{1,2,3,4,5};    //v5包含参数表中的元素
vector<T> v5={1,2,3,4,5};   //同上


列表初始化还是容量初始化?

在上述罗列的初始化方式中可以看出,我们对向量的初始化是列表初始值还是元素数量取决于用的圆括号还是花括号.

vector<int> v1(10);         //v1有10个元素,每个都是默认初始值
vector<int> v2{10};         //v2有1个元素,它的值是10

vector<int> v3(10,1);       //v3有10个元素,每个的值都是1
vector<int> v4{10,1};       //v4有2个元素,值为10和1


如果使用了花括号,但提供的值又无法进行列表初始化会怎么样?

编译器会尝试使用容量初始化

vector<string> vs1{10};             //vs1有10个元素,每个都是默认值
vector<string> vs2{10,"hhh"};       //vs2有10个元素,每个的值都是"hhh"


数组

复杂的数组定义

//Example
int *ptrs[10];                  //ptrs是一个数组,含有10个int类型指针
int &refs[10] = /*?*/;          //refs是一个数组,但不存在引用的数组,因此此定义错误
int (*Parray)[10] = &arr;       //Parray是一个指针,指向一个含有10个int的数组
int (&arrRef)[10] = arr;        //arrRef是一个引用,引用自一个含有10个int的数组


读懂复杂数组声明的方法

两点原则:(这跟读懂顶层、底层const很相似)

1.定性 复杂的声明中常有* & [] 也就是指针,引用,数组这三重修饰词修饰变量名,找出变量名的本质,也就是变量本质上是一个指针,引用抑或是数组. 为了做到这一点依赖于第二点:阅读次序

2.阅读次序 有括号先读括号内,无括号从右向左读. 第一个读出的就是变量名的本质

//Example
int *(&arry)[10] = ptrs;
//这是一个复杂的定义,按照上面的原则先对其定性
//有括号先读括号内,于是知道这是一个引用
//下一步就是弄清楚这是对什么的引用
//按照从右往左读的原则,这是一个对数组的引用
//进一步完善,这是一个对指针数组的引用,指针类型是int*,数组有10个元素


数组与指针

数组名

int ia[] = {1,2,3,4,5,6};


ia是数组名,同时也有另一层含义,即ia是 指向ia数组第一个元素的指针.

当用auto自动推断类型时,返回是int* 而不是数组

而使用关键字decltype返回的类型则是由10个整型组成的数组(int[10])

auto a_type(ia);            //a_type的类型是 int*
decltype(ia) d_type;        //d_type的类型是 int[10]


获取头指针和尾后指针

标准库函数begin和end

int ia[] = {1,2,3,4,5};
int *beg = begin(ia);       //beg是ia数组头指针
int *last = end(ia);        //last是ia数组尾后指针


多维数组

使用范围for 处理多维数组

using matrix = int[10][10];
matrix mt;                         //定义了一个二维数组
int i = 1;
for (auto &row : mt) {             //key 将auto钦定为引用
for (auto &col : row) {
col = i++;
}
}


要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型.

如果不钦定为引用类型,写成如下形式

//非指定引用
for(auto row : mt)
for(auto col : row)


row将会自动获取为int*类型,程序无法通过编译(这一点详见上述 数组与指针—数组名—auto与decltype)

//指定引用
for(auto &row : mt)
for(auto col : row)


row自动获取类型为int &[10],可以吧row看做是int[10][10]的下一级成员

第二层循环中col可看做是row的再下一级成员,即int&[10]的下一级—–int类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: