C++ STL array容器訪問(wèn)元素的幾種方式
當(dāng) array 容器創(chuàng)建完成之后,最常做的操作就是獲取其中的元素,甚至有時(shí)還會(huì)通過(guò)循環(huán)結(jié)構(gòu)獲取多個(gè)元素。本節(jié)就對(duì)獲取容器中元素的方法做個(gè)匯總。
訪問(wèn)array容器中單個(gè)元素
首先,可以通過(guò)容器名[]的方式直接訪問(wèn)和使用容器中的元素,這和 C++ 標(biāo)準(zhǔn)數(shù)組訪問(wèn)元素的方式相同,例如:
values[4] = values[3] + 2.O*values[1];
此行代碼中,第 5 個(gè)元素的值被賦值為右邊表達(dá)式的值。需要注意的是,使用如上這樣方式,由于沒(méi)有做任何邊界檢查,所以即便使用越界的索引值去訪問(wèn)或存儲(chǔ)元素,也不會(huì)被檢測(cè)到。
為了能夠有效地避免越界訪問(wèn)的情況,可以使用 array 容器提供的 at() 成員函數(shù),例如 :
values.at (4) = values.at(3) + 2.O*values.at(1);
這行代碼和前一行語(yǔ)句實(shí)現(xiàn)的功能相同,其次當(dāng)傳給 at() 的索引是一個(gè)越界值時(shí),程序會(huì)拋出 std::out_of_range 異常。因此當(dāng)需要訪問(wèn)容器中某個(gè)指定元素時(shí),建議大家使用 at(),除非確定索引沒(méi)有越界。
讀者可能有這樣一個(gè)疑問(wèn),即為什么 array 容器在重載 [] 運(yùn)算符時(shí),沒(méi)有實(shí)現(xiàn)邊界檢查的功能呢?答案很簡(jiǎn)單,因?yàn)樾阅堋H绻看卧L問(wèn)元素,都去檢查索引值,無(wú)疑會(huì)產(chǎn)生很多開(kāi)銷。當(dāng)不存在越界訪問(wèn)的可能時(shí),就能避免這種開(kāi)銷。
除此之外,array 容器還提供了 get<n> 模板函數(shù),它是一個(gè)輔助函數(shù),能夠獲取到容器的第 n 個(gè)元素。需要注意的是,該模板函數(shù)中,參數(shù)的實(shí)參必須是一個(gè)在編譯時(shí)可以確定的常量表達(dá)式,所以它不能是一個(gè)循環(huán)變量。也就是說(shuō),它只能訪問(wèn)模板參數(shù)指定的元素,編譯器在編譯時(shí)會(huì)對(duì)它進(jìn)行檢查。
下面代碼展示了如何使用 get<n> 模板函數(shù):
#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; //越界,會(huì)發(fā)生編譯錯(cuò)誤 return 0; }
運(yùn)行結(jié)果為:
four
另外,array 容器提供了 data() 成員函數(shù),通過(guò)調(diào)用該函數(shù)可以得到指向容器首個(gè)元素的指針。通過(guò)該指針,我們可以獲得容器中的各個(gè)元素,例如:
#include <iostream> #include <array> using namespace std; int main() { array<int, 5> words{1,2,3,4,5}; cout << *( words.data()+1); return 0; }
運(yùn)行結(jié)果為:
2
訪問(wèn)array容器中多個(gè)元素
我們知道,array 容器提供的 size() 函數(shù)能夠返回容器中元素的個(gè)數(shù)(函數(shù)返回值為 size_t 類型),所以能夠像下面這樣去逐個(gè)提取容器中的元素,并計(jì)算它們的和:
double total = 0; for(size_t i = 0 ; i < values.size() ; ++i) { total += values[i]; }
size() 函數(shù)的存在,為 array 容器提供了標(biāo)準(zhǔn)數(shù)組所沒(méi)有的優(yōu)勢(shì),即能夠知道它包含多少元素。
并且,接受數(shù)組容器作為參數(shù)的函數(shù),只需要通過(guò)調(diào)用容器的成員函數(shù) size(),就能得到元素的個(gè)數(shù)。除此之外,通過(guò)調(diào)用 array 容器的 empty() 成員函數(shù),即可知道容器中有沒(méi)有元素(如果容器中沒(méi)有元素,此函數(shù)返回 true),如下所示:
if(values.empty()) std::cout << "The container has no elements.\n"; else std::cout << "The container has "<< values.size()<<"elements.\n";
然而,很少會(huì)創(chuàng)建空的 array 容器,因?yàn)楫?dāng)生成一個(gè) array 容器時(shí),它的元素個(gè)數(shù)就固定了,而且無(wú)法改變,所以生成空 array 容器的唯一方法是將模板的第二個(gè)參數(shù)指定為 0,但這種情況基本不可能發(fā)生。
array 容器之所以提供 empty() 成員函數(shù)的原因,對(duì)于其他元素可變或者元素可刪除的容器(例如 vector、deque 等)來(lái)說(shuō),它們使用 empty() 時(shí)的機(jī)制是一樣的,因此為它們提供了一個(gè)一致性的操作。
除了借助 size() 外,對(duì)于任何可以使用迭代器的容器,都可以使用基于范圍的循環(huán),因此能夠更加簡(jiǎn)便地計(jì)算容器中所有元素的和,比如:
double total = 0; for(auto&& value : values) total += value;
下面是一個(gè)示例,展示了本節(jié)關(guān)于如何獲取 array 容器中元素所講到的知識(shí):
#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; }
運(yùn)行結(jié)果為:
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
到此這篇關(guān)于C++ STL array容器訪問(wèn)元素的幾種方式的文章就介紹到這了,更多相關(guān)C++ STL array容器訪問(wèn)元素內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++數(shù)據(jù)結(jié)構(gòu)之單鏈表
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之單鏈表,鏈表是由一個(gè)個(gè)結(jié)點(diǎn)鏈結(jié)成的。結(jié)點(diǎn)包括數(shù)據(jù)域和指針域兩部分,數(shù)據(jù)域用來(lái)存儲(chǔ)數(shù)據(jù)元素的信息,指針域用來(lái)存儲(chǔ)下一個(gè)結(jié)點(diǎn)的地址,更詳細(xì)內(nèi)容請(qǐng)需要的小伙伴參考下面文章內(nèi)容2022-01-01C++ Vector 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)
這篇文章主要介紹了C++ Vector 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01淺談c++性能測(cè)試工具google benchmark
本文將會(huì)介紹如何使用模板以及參數(shù)生成器來(lái)批量生成測(cè)試用例,簡(jiǎn)化繁瑣的性能測(cè)試代碼2021-06-06C++中declspec(dllexport)和declspec(dllimport)?的用法介紹
這篇文章介紹了C++中declspec(dllexport)和declspec(dllimport)?的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04基于Qt制作一個(gè)定時(shí)關(guān)機(jī)的小程序
這篇文章主要為大家詳細(xì)介紹了如何基于Qt制作一個(gè)有趣的定時(shí)關(guān)機(jī)的小程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12