六一的部落格


关关难过关关过,前路漫漫亦灿灿。



均返回指示位置元素的引用

顺序容器 front back at/下标运算符
array O O O
vector(string) O O O
deque O O O
list O O -
forward_list O X -
  1. at和下标运算符都 [] 是下标访问,用于连续存储容器元素的随机访问

    at优于下标运算符,会检查下标越界
  2. front的实现可以是解引用指向首元素的迭代器,也可以是随机访问pos = 0
  3. 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异常

顺序容器操作: 访问元素


均返回指示位置元素的引用

顺序容器 front back at/下标运算符
array O O O
vector(string) O O O
deque O O O
list O O -
forward_list O X -
  1. at和下标运算符都 [] 是下标访问,用于连续存储容器元素的随机访问

    at优于下标运算符,会检查下标越界
  2. front的实现可以是解引用指向首元素的迭代器,也可以是随机访问pos = 0
  3. 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异常