1. 程式人生 > 程式設計 >C++ STL array容器訪問元素的幾種方式

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,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容器訪問元素內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!