Chapter 3: Strings Vectors and Arrays

  • string类型是怎样比较大小的?
    1. 如果两个string对象的长度不同, 而且较短的string对象的每个字符都与较长string对象对应位置上的字符相同, 则较短string对象小于较长对象.
    2. 如果两个string对象在某些对应位置上不一致, 则比较第一对相异字符.
    3. 当两个string对象长度相等, 所有字符对应相同, 则string对象相等.

  • 使用string类型时要注意的地方
    1. 使用IO操作符读写string对象时从第一个非空白字符开始到下一个空白字符结束.
    2. size函数返回的类型是size_type而不是int.
    3. 将字符(串)字面值与string对象相加是确保每个+两侧至少有一个string对象.
    4. 将字符串字面值赋给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型指针

理解复杂数组声明的要点是: 以名字为中心, 从内而外, 自右向左分析.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值