C++ 顺序容器访问元素
2016-12-11 16:53
337 查看
C++ 顺序容器之访问元素
一、顺序容器类型回顾:
二、访问元素:
如果容器中没有元素,访问操作的结果是未定义的,因此访问之前一定要”检查容器是否有元素“!
包括array在内的每个容器都有一个front成员函数,而除forward_list之外的所有容器都有一个back成员函数。这两个操作分别返回首元素和尾元素的引用。
此程序用两种不同方式来获取c 中首元素和尾元素的引用。直接的方法是调用front和back。而间接的方法是通过解引用begin返回的迭代器来获得首元素的引用,以及通过递减然后解引用end返回的迭代器来获得尾元素的引用。
该程序有两点值得注意:迭代器end指向的是容器尾元素之后的(不存在的)元素。为了获取尾元素,必须首先递减迭代器。 另一个重要之处是,在调用front和back(或解引用begin和end返回的迭代器)之前,要确保 c 非空。如果容器为空,if 中操作的行为将是未定义的。
三、访问成员函数返回的是引用:
在容器中访问元素的成员函数(即,front、back、下标和at)返回的都是引用。
四、下标操作和安全的随机访问:
at 总是会做边界检查,下标运算符(operator[] )不做边界检查。
提供快速随机访问的容器(string、vector、deque和array)也都提供下标运算符。下标运算符接受一个下标参数,返回容器中该位置的元素的引用。给定下标必须”在范围内“(即,大于等于0,且小于容器的大小)。保证下标有效是程序员的责任,下标运算符并不检查下标是否在合法范围内。使用越界的下标是一种严重的程序设计错误,而且编译器并不检查这种错误。
如果我们希望确保下标是合法的,可以使用at 成员函数。at 成员函数类似下标运算符,但如果下标越界,at 会抛出一个out_of_range异常:
一、顺序容器类型回顾:
vector | 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。 |
deque | 双端队列。支持快速随机访问。在头尾位置插入/删除速度很快。 |
list | 双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快。 |
forward_list | 单向链表。只支持单向顺序访问。在链表任何位置进行插入/删除操作速度都很快。 |
array | 固定大小数组。支持快速随机访问。不能添加或删除元素。 |
string | 与vector相似的容器,但专门用于保存字符。随机访问快。在尾部插入/删除速度快。 |
如果容器中没有元素,访问操作的结果是未定义的,因此访问之前一定要”检查容器是否有元素“!
包括array在内的每个容器都有一个front成员函数,而除forward_list之外的所有容器都有一个back成员函数。这两个操作分别返回首元素和尾元素的引用。
// 在解引用一个迭代器或调用front或back之前检查是否有元素 if (!c.empty()) { // val 和 val2 是c中第一个元素值的拷贝 auto val = *c.begin(), val2 = c.front(); // val3 和 vla4 是c中最后一个元素的拷贝 auto last = c.end(); auto val3 = *(--last); // 不能递减forward_list迭代器 auto val4 = c.back(); // forward_list 不支持 }
此程序用两种不同方式来获取c 中首元素和尾元素的引用。直接的方法是调用front和back。而间接的方法是通过解引用begin返回的迭代器来获得首元素的引用,以及通过递减然后解引用end返回的迭代器来获得尾元素的引用。
该程序有两点值得注意:迭代器end指向的是容器尾元素之后的(不存在的)元素。为了获取尾元素,必须首先递减迭代器。 另一个重要之处是,在调用front和back(或解引用begin和end返回的迭代器)之前,要确保 c 非空。如果容器为空,if 中操作的行为将是未定义的。
三、访问成员函数返回的是引用:
在容器中访问元素的成员函数(即,front、back、下标和at)返回的都是引用。
四、下标操作和安全的随机访问:
at 总是会做边界检查,下标运算符(operator[] )不做边界检查。
提供快速随机访问的容器(string、vector、deque和array)也都提供下标运算符。下标运算符接受一个下标参数,返回容器中该位置的元素的引用。给定下标必须”在范围内“(即,大于等于0,且小于容器的大小)。保证下标有效是程序员的责任,下标运算符并不检查下标是否在合法范围内。使用越界的下标是一种严重的程序设计错误,而且编译器并不检查这种错误。
如果我们希望确保下标是合法的,可以使用at 成员函数。at 成员函数类似下标运算符,但如果下标越界,at 会抛出一个out_of_range异常:
vector<string> svec; // 空vecotr cout << svec[0]; // 运行时错误:svec中没有元素 cout << svec.at(0); // 抛出一个out_of_range 异常
相关文章推荐
- c++中在顺序容器中访问、插入、删除元素的操作
- c++中在顺序容器中访问、插入、删除元素的操作
- 【C/C++】顺序容器访问元素和删除元素
- C++ STL 顺序容器访问最后一个元素的方法
- C++ 顺序容器的操作(5) 访问元素 back、front、下标操作符、at
- C++语法基础--顺序容器(三)--关系操作符,容器大小的操作,访问元素,删除元素,查找元素
- C++顺序容器删除元素时的一个小陷阱(C++ primer第四版习题9.26)
- c++primer之顺序容器(访问元素)
- C++ multimap容器访问同一键值元素的不同方法
- STL 容器和迭代器连载8_访问顺序容器的元素
- c++之vector(容器)初始化、操作、顺序访问
- STL 容器和迭代器连载8_访问顺序容器的元素
- 顺序容器5 访问元素
- C++ 顺序容器的安全随机访问
- C++顺序容器中添加元素
- C++ 顺序容器的操作(6) 删除元素 erase、clear、pop_back、pop_front
- 顺序容器--添加及访问元素
- STL 容器和迭代器连载8_访问顺序容器的元素
- 【C++】容器适配器实现栈Stack的各种功能(入栈、出栈、判空、大小、访问所有元素等)
- 【C++】容器适配器实现队列Queue的各种功能(入队、出队、判空、大小、访问所有元素等)