顺序容器操作: 访问元素
2023年12月22日 2023年12月23日
均返回指示位置元素的引用
顺序容器 | front | back | at/下标运算符 |
---|---|---|---|
array | O | O | O |
vector(string) | O | O | O |
deque | O | O | O |
list | O | O | - |
forward_list | O | X | - |
- at和下标运算符都
[]
是下标访问,用于连续存储容器元素的随机访问
at优于下标运算符,会检查下标越界 - front的实现可以是解引用指向首元素的迭代器,也可以是随机访问pos = 0
- back的实现可以是解引用指向尾元素的迭代器,也可以是随机访问pos = size - 1
front和back操作
要求容器非空
1c.front(); 2 3c.back();
front操作
返回首元素的引用
解引用begin操作返回的迭代器也可获得首元素的引用
1if (!c.empty()) 2{ 3 // front返回的是首元素的引用,可以进行写操作 4 c.front() = 42; 5 6 // auto可以作为引用类型, 要求提供&. 可以对首元素进行写操作 7 auto &v = c.front(); 8 v = 1024; 9 10 // 此时v2是拷贝. 首元素的值未修改 11 auto v2 = c.front(); 12 v2 = 0; 13}
back操作
返回尾元素的引用
递减end操作返回的尾后迭代器,再执行解引用也可获得尾元素
解引用rbegin操作返回的迭代器也可获得尾元素
forward_list不支持back操作: 其不支持反向迭代器, 迭代器不支持递减操作
1if (!c.empty()) 2{ 3 // val是第一个元素的拷贝,val2也是第一个元素的拷贝 4 auto val = *c.begin(), val2 = c.front(); 5 6 // val3是最后一个元素的拷贝,val4也是最后一个元素的拷贝 7 auto last = c.end(); 8 auto val3 = *(--last); 9 auto val4 = c.back(); 10}
下标访问
返回下标为n的元素的引用
1c[n]; 2 3c.at(n);
下标运算符和at操作的区别
- 下标运算符不检查下标是否在合法范围内
- 如果发生下标越界, at操作会抛出out_of_range异常
使用越界的下标是一种严重的程序设计错误,而编译器不会检查这种错误
如果需要, 建议使用at操作
下标运算符
n是一个无符号整数, 0 <= n < c.size()
如果n >= c.size(), 函数行为未定义
1vector<string> svec; 2 3cout << svec[0]; // 运行时报错
at操作
n的类型为size_type, 容器相关
1vector<string> svec; 2 3cout << svec.at(0); // 抛出out_of_range异常