C++?容器?Vector?的使用方法
前言:
我們都是帶著問題學(xué)習(xí),假設(shè)一個任務(wù),也可以理解為一個問題,通過找解決方案來提升自己 c++ 的編程能力,嘗試這是否一條好的路線,希望找到這種學(xué)習(xí)方式有效
問題簡單描述一下,就是從以字符串,課程名稱組成的集合中將一些包含特定文字,將其從列表中刪除
Vector簡介
- Vector 是一個能夠存放任意類型的動態(tài)數(shù)組,有點(diǎn)類似數(shù)組,是一個連續(xù)地址空間,
Vector 與數(shù)組
- Vector 是支持動態(tài)空間大小調(diào)整
- 數(shù)組往往在定義需要指定固定大小
#include<vector>
要使用 vector 需要引入一下其頭文件
創(chuàng)建 vector 的各種方法
- 創(chuàng)建一個 T 類型的空 vector
- 創(chuàng)建時可以指定容量大小
- 創(chuàng)建時不但可以指定容量大小,還可以指定元素初始值
- 創(chuàng)建一個基于已有 vector 的拷貝
- 基于數(shù)組來創(chuàng)建 vector
vector<int> v1; vector<int> v2(5); vector<int> v3(5, 0); vector<int> copyOf(v3); int arr[] = { 1,2,3,5,7,9 }; vector<int> v5(arr, arr + 6);
v5.push_back(11);
向一個 vector 中添加元素
bool isEmpty = v1.empty();
訪問 vector 的元素
- 調(diào)用
vector::at()
- 調(diào)用
vector::operator[]
兩者的區(qū)別在于
- operator[] 提供類似數(shù)組的存取方式,但不做邊界是否越界檢查,訪問效率高
- at() 進(jìn)行邊界檢查,訪問越界則拋出 exception 效率不容 operator[],這樣開銷比較大,因?yàn)槲覀冇?c++ 主要還是要考慮到效率
vector<wstring> v; v.reserve(10); for (size_t i = 0; i < 3; i++) { wstringstream wss; wss << "[" << i << "]" << endl; v.push_back(wss.str()); } try { wstring wsz = v.at(5); } catch (const std::exception& ex) { cout << ex.what() << endl; }
刪除元素
- clear 清除整個 vector
- pop_back:彈出 vector 末尾元素
- erase: 刪除 vector 中某一位置的元素
使用 erase 來刪除某一個位置元素,可以指定 iterator 來刪除某一個元素,也可以通過條件函數(shù)找到 vector 中需要刪除的元素,這里 remove_if
為例說明
vector<string> tuts; tuts.push_back("machine learning basic tutorial"); tuts.push_back("deep learning basic tutorial"); tuts.push_back("transformer tutorial"); for (int i = 0; i < tuts.size(); i++) { cout << tuts[i] << endl; }
首先我們需要集合來承載這些字符串,這里我選擇了 vector
作為容器,這樣就得到了一個集合 tuts
vector<string> tuts; tuts.push_back( "machine learning basic tutorial" ); tuts.push_back("deep learning basic tutorial"); tuts.push_back("transformer tutorial"); for (int i = 0; i < tuts.size(); i++) { cout << tuts[i] << endl; string::size_type idx; idx = tuts[i].find("basic tutorial"); if (idx == string::npos) { cout << "Not Found" << endl; } else { cout << "Found" << endl; } }
這里定義這個函數(shù) isContainsBasicTut ,這個代碼是不是讓大家聯(lián)想到 map,這個函數(shù)通常會接受一個數(shù)組元素做輸入,返回一個 bool 類型值,滿足一定條件返回 true
bool isContainsBasicTut(string tutName) { string::size_type idx; idx = tutName.find("basic tutorial"); if (idx == string::npos) { return false; } else { return true; } }
然后可以調(diào)用 tuts
的 erase
也就是 vector
的刪除方法,這里 remove_if
方法并不會實(shí)際移除序列中的元素,只是將符合條件元素移動到容器末尾并返回指向第一個移除元素的位置的迭代器,接下來 erase 對 vector 容器中根據(jù) remove_if
提供的信息來對元素進(jìn)行清除。
vector<string> tuts; tuts.push_back( "machine learning basic tutorial" ); tuts.push_back("deep learning basic tutorial"); tuts.push_back("transformer tutorial"); tuts.erase( remove_if(tuts.begin(), tuts.end(), isContainsBasicTut), tuts.end()); for (int i = 0; i < tuts.size(); i++) { cout << tuts[i] << endl; }
接下來我們再通過一例子來看在實(shí)際開發(fā)中如何使用 if_remove
bool isOdd(int num) { return ((num % 2) == 1); } int main() { vector<int> nums{ 1, 2, 3, 10, 12, 15, 17, 20 }; remove_if(nums.begin(), nums.end(), isOdd); for (vector<int>::iterator it = nums.begin(); it != nums.end(); it++) cout << *it << "\t"; return 0; }
首先還是定義
到此這篇關(guān)于C++ 容器 Vector 的使用方法的文章就介紹到這了,更多相關(guān)C++ 容器Vector內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)圖的鄰接表存儲和廣度優(yōu)先遍歷實(shí)例分析
這篇文章主要介紹了C++實(shí)現(xiàn)圖的鄰接表存儲和廣度優(yōu)先遍歷,實(shí)例分析了C++實(shí)現(xiàn)圖的存儲與遍歷技巧,非常具有實(shí)用價值,需要的朋友可以參考下2015-04-04C++數(shù)據(jù)結(jié)構(gòu)繼承的概念與菱形繼承及虛擬繼承和組合
今天我要給大家介紹C++中更深入的內(nèi)容了。C++這門語言為了使代碼不冗余,做了些什么操作呢?C++的繼承就很好地實(shí)現(xiàn)了類層次的代碼復(fù)用,今天我就要來和大家好好聊一聊它了2022-02-02C語言實(shí)現(xiàn)簡單的圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單的圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-03-03VS Code遠(yuǎn)程連接Linux服務(wù)器調(diào)試C程序的操作方法
這篇文章主要介紹了VS Code遠(yuǎn)程連接Linux服務(wù)器調(diào)試C程序的操作方法,打開遠(yuǎn)程 Linux 服務(wù)器上的文件夾本文以 /root/ 為例,給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-12-12C語言使用rand函數(shù)生成隨機(jī)數(shù)
這篇文章介紹了C語言使用rand函數(shù)生成隨機(jī)數(shù)的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12