C++ STL array容器访问元素的几种方式

 更新时间:2021年01月21日 10:43:00   作者:c语言中文网  
这篇文章主要介绍了C++ STL array容器访问元素的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

访问array容器中单个元素

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

values[4] = values[3] + 2.O*values[1];

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

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

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

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

读者可能有这样一个疑问,即为什么 array 容器在重载 [] 运算符时,没有实现边界检查的功能呢?答案很简单,因为性能。如果每次访问元素,都去检查索引值,无疑会产生很多开销。当不存在越界访问的可能时,就能避免这种开销。

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

下面代码展示了如何使用 get<n> 模板函数:

#include <iostream>
#include <array>
#include <string>
using namespace std;
int main()
{
  array<string, 5> words{ "one","two","three","four","five" };
  cout << get<3>(words) << endl; // Output words[3]
  //cout << get<6>(words) << std::endl; //越界,会发生编译错误
  return 0;
}

运行结果为:
four

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

#include <iostream>
#include <array>
using namespace std;
int main()
{
  array<int, 5> words{1,2,3,4,5};
  cout << *( words.data()+1);
  return 0;
}

运行结果为:
2

访问array容器中多个元素

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

double total = 0;
for(size_t i = 0 ; i < values.size() ; ++i)
{
  total += values[i];
}

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

并且,接受数组容器作为参数的函数,只需要通过调用容器的成员函数 size(),就能得到元素的个数。除此之外,通过调用 array 容器的 empty() 成员函数,即可知道容器中有没有元素(如果容器中没有元素,此函数返回 true),如下所示:

if(values.empty())
  std::cout << "The container has no elements.\n";
else
  std::cout << "The container has "<< values.size()<<"elements.\n";

然而,很少会创建空的 array 容器,因为当生成一个 array 容器时,它的元素个数就固定了,而且无法改变,所以生成空 array 容器的唯一方法是将模板的第二个参数指定为 0,但这种情况基本不可能发生。

array 容器之所以提供 empty() 成员函数的原因,对于其他元素可变或者元素可删除的容器(例如 vector、deque 等)来说,它们使用 empty() 时的机制是一样的,因此为它们提供了一个一致性的操作。

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

double total = 0;
for(auto&& value : values)
  total += value;

下面是一个示例,展示了本节关于如何获取 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 (size_t i = 0; i < values1.size(); ++i)
  {
    values1.at(i) = i;
  }
  cout << "values1[0] is : " << values1[0] << endl;
  cout << "values1[1] is : " << values1.at(1) << endl;
  cout << "values1[2] is : " << get<2>(values1) << endl;
  //初始化 values2 为{10,11,12,13,14}
  int initvalue = 10;
  for (auto& value : values2)
  {
    value = initvalue;
    initvalue++;
  }
  cout << "Values1 is : ";
  for (auto i = values1.begin(); i < values1.end(); i++) {
    cout << *i << " ";
  }
  cout << endl << "Values2 is : ";
  for (auto i = values2.begin(); i < values2.end(); i++) {
    cout << *i << " ";
  }
  return 0;
}

运行结果为:

values1[0] is : 0
values1[1] is : 1
values1[2] is : 2
Values1 is : 0 1 2 3 4
Values2 is : 10 11 12 13 14

到此这篇关于C++ STL array容器访问元素的几种方式的文章就介绍到这了,更多相关C++ STL array容器访问元素内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现链表贪吃蛇

    C语言实现链表贪吃蛇

    这篇文章主要为大家详细介绍了C语言实现链表贪吃蛇,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • Qt计时器使用方法详解

    Qt计时器使用方法详解

    这篇文章为大家详细主要介绍了Qt计时器的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++数据结构之单链表

    C++数据结构之单链表

    这篇文章主要介绍了C++数据结构之单链表,链表是由一个个结点链结成的。结点包括数据域和指针域两部分,数据域用来存储数据元素的信息,指针域用来存储下一个结点的地址,更详细内容请需要的小伙伴参考下面文章内容
    2022-01-01
  • C++ Vector 动态数组的实现

    C++ Vector 动态数组的实现

    这篇文章主要介绍了C++ Vector 动态数组的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 浅谈c++性能测试工具google benchmark

    浅谈c++性能测试工具google benchmark

    本文将会介绍如何使用模板以及参数生成器来批量生成测试用例,简化繁琐的性能测试代码
    2021-06-06
  • C++11返回类型后置语法的使用示例

    C++11返回类型后置语法的使用示例

    本篇文章主要介绍了C++11返回类型后置语法的使用示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • C++中declspec(dllexport)和declspec(dllimport) 的用法介绍

    C++中declspec(dllexport)和declspec(dllimport) 的用法介绍

    这篇文章介绍了C++中declspec(dllexport)和declspec(dllimport) 的用法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C语言结构体struct详解

    C语言结构体struct详解

    C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型),下面这篇文章主要给大家介绍了关于C语言结构体(struct)的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 基于Qt制作一个定时关机的小程序

    基于Qt制作一个定时关机的小程序

    这篇文章主要为大家详细介绍了如何基于Qt制作一个有趣的定时关机的小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • C++继承的定义与注意事项

    C++继承的定义与注意事项

    这篇文章主要给大家介绍了关于C++继承的定义与注意事项的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论