欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ STL array容器訪問元素的幾種方式

 更新時間:2021年01月21日 10:43:00   作者:c語言中文網  
這篇文章主要介紹了C++ STL array容器訪問元素的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

當 array 容器創(chuàng)建完成之后,最常做的操作就是獲取其中的元素,甚至有時還會通過循環(huán)結構獲取多個元素。本節(jié)就對獲取容器中元素的方法做個匯總。

訪問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 個元素。需要注意的是,該模板函數中,參數的實參必須是一個在編譯時可以確定的常量表達式,所以它不能是一個循環(huá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; //越界,會發(fā)生編譯錯誤
  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 容器提供了標準數組所沒有的優(yōu)勢,即能夠知道它包含多少元素。

并且,接受數組容器作為參數的函數,只需要通過調用容器的成員函數 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";

然而,很少會創(chuàng)建空的 array 容器,因為當生成一個 array 容器時,它的元素個數就固定了,而且無法改變,所以生成空 array 容器的唯一方法是將模板的第二個參數指定為 0,但這種情況基本不可能發(fā)生。

array 容器之所以提供 empty() 成員函數的原因,對于其他元素可變或者元素可刪除的容器(例如 vector、deque 等)來說,它們使用 empty() 時的機制是一樣的,因此為它們提供了一個一致性的操作。

除了借助 size() 外,對于任何可以使用迭代器的容器,都可以使用基于范圍的循環(huán),因此能夠更加簡便地計算容器中所有元素的和,比如:

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

下面是一個示例,展示了本節(jié)關于如何獲取 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容器訪問元素內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言實現鏈表貪吃蛇

    C語言實現鏈表貪吃蛇

    這篇文章主要為大家詳細介紹了C語言實現鏈表貪吃蛇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Qt計時器使用方法詳解

    Qt計時器使用方法詳解

    這篇文章為大家詳細主要介紹了Qt計時器的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++數據結構之單鏈表

    C++數據結構之單鏈表

    這篇文章主要介紹了C++數據結構之單鏈表,鏈表是由一個個結點鏈結成的。結點包括數據域和指針域兩部分,數據域用來存儲數據元素的信息,指針域用來存儲下一個結點的地址,更詳細內容請需要的小伙伴參考下面文章內容
    2022-01-01
  • C++ Vector 動態(tài)數組的實現

    C++ Vector 動態(tài)數組的實現

    這篇文章主要介紹了C++ Vector 動態(tài)數組的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    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

最新評論