chapter 3 字符串,向量,数组
# 命名空间的using声明
头文件不应包含using声明;
注:using namespace std;
#标准库类型string
1.string 表示可变长的字符序列;
2.#include<string>
3.字符串字面量 与 string 是不同类型;
4.cctype头文件种定义了一组标准库函数(改变某个字符的特性). 书本P82;
5.范围for循环:
for (auto c:str) cout<< c <<endl;
要改变值,必须使用引用类型.eg. auto &c : str;
6.str[]:下标可以随机访问,但注意要防止越界;
#标准库类型vector
1.#include<vector>
2.vector是模板而非类型.生成类型必须包含vector元素的类型.eg: vector<int> vi;
3.最常见的方式是先定义一个空vector,然后当运行时获取到元素的值后再逐一添加;
vector<int> vi ;
for(int i=0;i<10;++i) vi.push_back(i);
在for语句体内不应改变其所遍历的序列的大小;
4.不能用下标形式添加元素:
下标运行符可用于访问已存在的元素,而不能用于添加元素;
确保下标合法的一种有效手段就是尽可能使用范围for语句;
#迭代器iterator
1.begin成员负责返回指向第一个元素(或者第一个字节)的迭代器.end成员则负责返回指向容器(或string对象)的"尾元素的下一位置"(尾后迭代器);
若容器为空,begin与end返回同一个迭代器,都是尾后迭代器;
2.*iterator:返回迭代器所指向元素的引用; ++iterator等等
3.所有标准库容器都定义了==和!=,大多数没有定义<运算符,所以要养成使用迭代器!=的习惯
4.迭代器这个名词有三种不同的含义:
(1)迭代器概念本身;(2)容器定义的迭代器类型;(3)某个迭代器对象;
5.使用迭代器的循环体,都不要向迭代器所属的容器添加元素;
6.使用迭代器运算:一个经典算法(二分搜素),有序序列查找某个给定的值;
//txt必须有序;
auto b = txt.begin(), e = txt.end();
auto mid = b+ (e-b)/2;
while(mid!=e && *mid!=value){ if(value< *mid) e = mid; else b = mid +1; mid = b+(e-b)/2;//新的中间点
}
#数组
1.数组的大小是确定不变的;维度必须是一个常量表达式;如果不清楚元素的确切个数,使用vector;
2.定义数组必须指定数组的类型;
3数组的元素为对象,因此不存在引用的数组;
4.不允许数组之间拷贝与赋值操作,eg:a2 = a;//错误!
5.理解复杂的数组声明:
int *(&arry)[10] = ptrs;//arry是一个数组的引用,该数组含有10个指针;
按照由内而外的顺序阅读:首先arry是一个引用,然后由右边知道,arry引用的对象是一个大小为10的数组.最后观察左边知道,数组的元素类型是指向int的指针;
6.指针与数组:
标准库函数begin和end
int *beg = begin(array);//array数组名;
int *last = end(array) ; //尾指针不能执行解操作和递增操作;
7.使用数组初始化vector对象
int int_arr[] = {0,1,2,3,4,5};
vector<int> ivec(begin(int_arr),end(int_arr));
8.多维数组
在使用范围for循环处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型;
tobecontinued