天天看点

C++ 顺序容器访问元素

C++ 顺序容器之访问元素

一、顺序容器类型回顾:
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 异常
           

继续阅读