第三(3)课:array容器访问元素的几种方式

54 阅读2分钟

当 array 容器创建完成之后,最常做的操作就是获取其中的元素,甚至有时还会通过循环结构获取多个元素。本节就对获取容器中元素的方法做个汇总。

一、访问array容器的单个元素

1、可以通过容器名[]的方式直接访问和使用容器中的元素,这和 C++ 标准数组访问元素的方式相同

values[4] = values[3] + 2.0 * values[1];

此行代码中,第 5 个元素的值被赋值为右边表达式的值。需要注意的是,使用如上这样方式,由于没有做任何边界检查,所以即便使用越界的索引值去访问或存储元素,也不会被检测到。

2、为了能够有效地避免越界访问的情况,可以使用 array 容器提供的 at() 成员函数

values.at(4) = values.at(3) + values.at(1)*2.0;

这行代码和前一行语句实现的功能相同,其次当传给 at() 的索引是一个越界值时,程序会抛出 std::out_of_range 异常。因此当需要访问容器中某个指定元素时,建议大家使用 at(),除非确定索引没有越界。

3、array 容器还提供了 get 模板函数,它是一个辅助函数,能够获取到容器的第 n 个元素。需要注意的是,该模板函数中,参数的实参必须是一个在编译时可以确定的常量表达式,所以它不能是一个循环变量。也就是说,它只能访问模板参数指定的元素,编译器在编译时会对它进行检查。

#include <iostream>
#include <array>
#include <string>

using namespace std;

int main() {
	array<string, 5> values{ "one","two","three","four","five" };
	cout << get<0>(values) << endl;
	//cout << get<6>(words) << std::endl; //越界,会发生编译错误
	return 0;
}    

4、array 容器提供了 data() 成员函数,通过调用该函数可以得到指向容器首个元素的指针。通过该指针,我们可以获得容器中的各个元素

#include <iostream>
#include <array>

using namespace std;

int main() {
	array<int, 5>values{ 1,2,3,4,5 };
	int* p = values.data();
	cout << *(p+1) << endl;
	return 0;
}    

二、访问array容器中多个元素

1、array 容器提供的 size() 函数能够返回容器中元素的个数(函数返回值为 size_t 类型),所以能够像下面这样去逐个提取容器中的元素,并计算它们的和:

#include <iostream>
#include <array>

using namespace std;

int main() {
	array<double, 5>values{ 1.0, 2.0, 3.0, 4.0, 5.0 };
	double total = 0;
	for (size_t i = 0; i < values.size();++i) {
		total += values[i];
	}
	cout << total << endl;
	return 0;
}    

size() 函数的存在,为 array 容器提供了标准数组所没有的优势,即能够知道它包含多少元素。

2、除了借助 size() 外,对于任何可以使用迭代器的容器,都可以使用基于范围的循环,因此能够更加简便地计算容器中所有元素的和,比如

#include <iostream>
#include <array>

using namespace std;

int main() {
	array<double, 5>values{ 1.0, 2.0, 3.0, 4.0, 5.0 };
	double total = 0;
	for (auto&& value : values) {
		total += value;
	}
	cout << total << endl;
	return 0;
}                    

3、下面是一个示例,展示了本节关于如何获取 array 容器中元素所讲到的知识:

#include <iostream>
#include <iomanip>
#include <array>

using namespace std;

int main() {
	array<int, 5> values1;
	array<int, 5> values2;

	//初始化 values1 为 {0,1,2,3,4}
	for (auto i = 0; i < values1.size(); i++) {
		values1.at(i) = i;
	}

	cout << values1[1] << endl;
	cout << values1.at(1) << endl;
	cout << get<2>(values1) << endl;

	//初始化 values2 为{10,11,12,13,14}
	int initvalue = 10;
	for (auto&& value : values2) {
		value = initvalue;
		initvalue++;
	}
	for (auto&& value : values2) {
		cout << value << " ";
	}
	cout << endl;
	for (auto i = values2.begin();i < values2.end();++i) {
		cout << *i << " ";
	}
	return 0;
}