- string类型是怎样比较大小的?
- 如果两个string对象的长度不同, 而且较短的string对象的每个字符都与较长string对象对应位置上的字符相同, 则较短string对象小于较长对象.
- 如果两个string对象在某些对应位置上不一致, 则比较第一对相异字符.
- 当两个string对象长度相等, 所有字符对应相同, 则string对象相等.
- 使用string类型时要注意的地方
- 使用IO操作符读写string对象时从第一个非空白字符开始到下一个空白字符结束.
- size函数返回的类型是size_type而不是int.
- 将字符(串)字面值与string对象相加是确保每个+两侧至少有一个string对象.
- 将字符串字面值赋给string时末尾的\0字符被舍弃.
- 范围for语句是什么?
for(declaration : expression)
statement
/* expression部分是一个对象, 表示一个序列; declartion负责定义一个变量, 该变量用于访问序列中的基础元素, 每次迭代变量会被初始化为序列的下一个元素值 */
string str("Some string");
for(auto c : str) // 对于str字符序列的每个字符
`cout << c << endl; // 输出当前字符
- 定义并初始化vector
初始化vector的几种方式:
vector<int> intVec1; // 默认初始化, intVec1里没有元素
vector<int> intVec2(intVec1); // 拷贝初始化, 将intVec1拷贝给intVec2
vector<int> intVec3 = intVec1; //拷贝初始化, 将intVec1拷贝给intVec3
vector<int> intVec4(2); // 拷贝初始化, intVec4有一个元素, 初始化为2
vector<int> intVec5(2, 0); // 带数量的拷贝初始化, intVec5有两个元素, 都初始化为0
vector<int> intVect6{2, 0}; // 列表初始化, intVec6有两个元素, 分别初始化为2, 0
vector<int> intVec7 = {2, 0}; // 列表初始化, intVec6有两个元素, 分别初始化为2, 0
vector<string> strVec1{2}; // 编译器尝试用2列表初始化string失败, 故将2看作数量, strVec1含有两个元素, 执行string类型的默认初始化
vector<string> strVec2(2, "hello");// 带数量的拷贝初始化, strVec2有两个元素, 都初始化为hello
vector<string> strVec3{2, "hello"};// 编译器尝试用2列表初始化string失败, 故将2看作数量, strVec1含有两个元素, 都初始化为hello
vector<string> strVec4 = {2, "hello"};// 编译器尝试用2列表初始化string失败, 故将2看作数量, strVec1含有两个元素, 都初始化为hello
vector<string> strVec5("hello") // 无法用字符串字面值构造string, 错误
vector的初始化很复杂, 我以后统一采用以下方式:
vector<T> vec1 = {}; // 定义空vector(元素数量在程序中确定) vector<T> vec2 = vec1; // 定义从已知vector拷贝初始化的vector vector<T> vec3 = {a, b, c, ...}; // 定义每个元素都确定的vector, 用列表初始化 vector<T> vec4(n, val); // 定义元素数量确定的vector
- 关于迭代器
迭代器可用来访问所有标准库容器类型的元素(string可以看作是char类型对象的容器).
使用迭代器的要点有:
vector<string> intVec = {"hello", "world"};
vector<string> iterator beg = intVec.begin(); // 获取指向intVec第一个元素的迭代器
vector<string>::iterator end intVec.end(); // 获取指向intVec尾元素下一个位置的迭代器
string str = *beg; // 返回迭代器所指元素的引用
beg->empty(); // 解引迭代器并获取该元素的成员(成员函数) 同(*beg).empty()
beg++; // 迭代器自增, 也可自减
beg + 10; // 迭代器后移10个位置, 也可前移
beg == end; // 迭代器比较
vector<string>::difference_type dis = end -beg; // 获取两迭代器之间的距离
beg <= end; // 迭代器位置比较
vector<string>::const_iterator cIter = inVec.begin(); // 定义cosnt迭代器, 无法通过迭代器修改元素的值
- 理解复杂的数组声明
int *ptrArray[10]; // [10]表示ptrArray是一个包含10个元素的数组, *表示数组内元素是指针类型. int表示指针指向int类型
int (*ptr)[10]; // *表示ptr是指针, [10]表示指针指向大小为10的数组, int表示数组的元素是int类型
int &refArray[10]; // 错误, 数组内的元素必须是对象, 而引用不是对象, 所以没有引用类型的数组
int (&ref)[10]; //&表示ref是引用, [10]表示引用绑定大小为10的数组, int表示数组的元素是int类型
int *(&array)[10]; // array是绑定大小为10的数组的引用, 数组元素的类型是int型指针
理解复杂数组声明的要点是: 以名字为中心, 从内而外, 自右向左分析.