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++中declspec(dllexport)和declspec(dllimport)?的用法介紹
這篇文章介紹了C++中declspec(dllexport)和declspec(dllimport)?的用法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04