詳解C++ STL vector容器訪問元素的幾種方式
學會如何創建並初始化 vector 容器之後,本節繼續來學習如何獲取(甚至修改)容器中存儲的元素。
訪問vector容器中單個元素
首先,vector 容器可以向普通數組那樣訪問存儲的元素,甚至對指定下標處的元素進行修改,比如:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> values{1,2,3,4,5}; //獲取容器中首個元素 cout << values[0] << endl; //修改容器中下標為 0 的元素的值 values[0] = values[1] + values[2] + values[3] + values[4]; cout << values[0] << endl; return 0; }
運行結果為:
1
14
顯然,vector 的索引從 0 開始,這和普通數組一樣。通過使用索引,總是可以訪問到 vector 容器中現有的元素。
值得一提的是,容器名[n]這種獲取元素的方式,需要確保下標 n 的值不會超過容器的容量(可以通過 capacity() 成員函數獲取),否則會發生越界訪問的錯誤。幸運的是,和 array 容器一樣,vector 容器也提供瞭 at() 成員函數,當傳給 at() 的索引會造成越界時,會拋出std::out_of_range異常。
舉個例子:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> values{1,2,3,4,5}; //獲取容器中首個元素 cout << values.at(0) << endl; //修改容器中下標為 0 的元素的值 values.at(0) = values.at(1) + values.at(2) + values.at(3) + values.at(4); cout << values.at(0) << endl; //下面這條語句會發生 out_of_range 異常 //cout << values.at(5) << endl; return 0; }
運行結果為:
1
14
讀者可能有這樣一個疑問,即為什麼 vector 容器在重載 [] 運算符時,沒有實現邊界檢查的功能呢?答案很簡單,因為性能。如果每次訪問元素,都去檢查索引值,無疑會產生很多開銷。當不存在越界訪問的可能時,就能避免這種開銷。
除此之外,vector 容器還提供瞭 2 個成員函數,即 front() 和 back(),它們分別返回 vector 容器中第一個和最後一個元素的引用,通過利用這 2 個函數返回的引用,可以訪問(甚至修改)容器中的首尾元素。
舉個例子:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> values{1,2,3,4,5}; cout << "values 首元素為:" << values.front() << endl; cout << "values 尾元素為:" << values.back() << endl; //修改首元素 values.front() = 10; cout <<"values 新的首元素為:" << values.front() << endl; //修改尾元素 values.back() = 20; cout << "values 新的尾元素為:" << values.back() << endl; return 0; }
輸出結果為:
values 首元素為:1
values 尾元素為:5
values 新的首元素為:10
values 新的尾元素為:20
另外,vector 容器還提供瞭 data() 成員函數,該函數的功能是返回指向容器中首個元素的指針。通過該指針也可以訪問甚至修改容器中的元素。比如:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> values{1,2,3,4,5}; //輸出容器中第 3 個元素的值 cout << *(values.data() + 2) << endl; //修改容器中第 2 個元素的值 *(values.data() + 1) = 10; cout << *(values.data() + 1) << endl; return 0; }
運行結果為:
3
10
訪問vector容器中多個元素
如果想訪問 vector 容器中多個元素,可以借助 size() 成員函數,該函數可以返回 vector 容器中實際存儲的元素個數。例如:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> values{1,2,3,4,5}; //從下標 0 一直遍歷到 size()-1 處 for (int i = 0; i < values.size(); i++) { cout << values[i] << " "; } return 0; }
運行結果為:
1 2 3 4 5
註意,這裡不要使用 capacity() 成員函數,因為它返回的是 vector 容器的容量,而不是實際存儲元素的個數,這兩者是有差別的。
關於 vector 容器 capacity() 和 size() 的差別,可以閱讀 《STL vector容量(capacity)和大小(size)的區別》一文。
或者也可以使用基於范圍的循環,此方式將會逐個遍歷容器中的元素。比如:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> values{1,2,3,4,5}; for (auto&& value : values) cout << value << " "; return 0; }
運行結果為:
1 2 3 4 5
另外還可以使用 vector 迭代器遍歷 vector 容器,這裡以 begin()/end() 為例:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> values{1,2,3,4,5}; for (auto first = values.begin(); first < values.end(); ++first) { cout << *first << " "; } return 0; }
運行結果為:
1 2 3 4 5
當然,這裡也可以使用 rbegin()/rend()、cbegin()/cend()、crbegin()/crend() 以及全局函數 begin()/end() ,它們都可以實現對容器中元素的訪問。
到此這篇關於詳解C++ STL vector容器訪問元素的幾種方式的文章就介紹到這瞭,更多相關C++ STL vector容器訪問元素內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C++中最常用的容器用法與排序實例
- C++ STL標準庫std::vector的使用詳解
- C++入門筆記之std::vector容器詳解
- 淺談C++STL之雙端隊列容器
- C++vector的用法你都知道嘛