C++?容器?Vector?的使用方法
前言:
我們都是帶著問(wèn)題學(xué)習(xí),假設(shè)一個(gè)任務(wù),也可以理解為一個(gè)問(wèn)題,通過(guò)找解決方案來(lái)提升自己 c++ 的編程能力,嘗試這是否一條好的路線(xiàn),希望找到這種學(xué)習(xí)方式有效
問(wèn)題簡(jiǎn)單描述一下,就是從以字符串,課程名稱(chēng)組成的集合中將一些包含特定文字,將其從列表中刪除
Vector簡(jiǎn)介
- Vector 是一個(gè)能夠存放任意類(lèi)型的動(dòng)態(tài)數(shù)組,有點(diǎn)類(lèi)似數(shù)組,是一個(gè)連續(xù)地址空間,
Vector 與數(shù)組
- Vector 是支持動(dòng)態(tài)空間大小調(diào)整
- 數(shù)組往往在定義需要指定固定大小
#include<vector>
要使用 vector 需要引入一下其頭文件
創(chuàng)建 vector 的各種方法
- 創(chuàng)建一個(gè) T 類(lèi)型的空 vector
- 創(chuàng)建時(shí)可以指定容量大小
- 創(chuàng)建時(shí)不但可以指定容量大小,還可以指定元素初始值
- 創(chuàng)建一個(gè)基于已有 vector 的拷貝
- 基于數(shù)組來(lái)創(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);
向一個(gè) vector 中添加元素
bool isEmpty = v1.empty();
訪問(wèn) vector 的元素
- 調(diào)用
vector::at() - 調(diào)用
vector::operator[]
兩者的區(qū)別在于
- operator[] 提供類(lèi)似數(shù)組的存取方式,但不做邊界是否越界檢查,訪問(wèn)效率高
- at() 進(jìn)行邊界檢查,訪問(wèn)越界則拋出 exception 效率不容 operator[],這樣開(kāi)銷(xiāo)比較大,因?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 清除整個(gè) vector
- pop_back:彈出 vector 末尾元素
- erase: 刪除 vector 中某一位置的元素
使用 erase 來(lái)刪除某一個(gè)位置元素,可以指定 iterator 來(lái)刪除某一個(gè)元素,也可以通過(guò)條件函數(shù)找到 vector 中需要?jiǎng)h除的元素,這里 remove_if 為例說(shuō)明
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;
}首先我們需要集合來(lái)承載這些字符串,這里我選擇了 vector 作為容器,這樣就得到了一個(gè)集合 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;
}
}這里定義這個(gè)函數(shù) isContainsBasicTut ,這個(gè)代碼是不是讓大家聯(lián)想到 map,這個(gè)函數(shù)通常會(huì)接受一個(gè)數(shù)組元素做輸入,返回一個(gè) bool 類(lèi)型值,滿(mǎn)足一定條件返回 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 方法并不會(huì)實(shí)際移除序列中的元素,只是將符合條件元素移動(dòng)到容器末尾并返回指向第一個(gè)移除元素的位置的迭代器,接下來(lái) erase 對(duì) vector 容器中根據(jù) remove_if 提供的信息來(lái)對(duì)元素進(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;
}接下來(lái)我們?cè)偻ㄟ^(guò)一例子來(lái)看在實(shí)際開(kāi)發(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析C++中boost.variant的幾種訪問(wèn)方法
variant類(lèi)型在C++14并沒(méi)有加入,若想在不支持C++17的編譯器上使用variant類(lèi)型,我們可以通過(guò)boost的variant類(lèi)型,variant類(lèi)型可以表示任意一種類(lèi)型和any類(lèi)型有些相似,但還是有些區(qū)別下面將淺談variant的幾種訪問(wèn)方法,感興趣的朋友們下面來(lái)一起看看吧。2016-10-10
基于Qt OpenCV實(shí)現(xiàn)圖像數(shù)據(jù)采集軟件
這篇文章主要為大家詳細(xì)介紹了如何利用Qt+OpenCV實(shí)現(xiàn)圖像數(shù)據(jù)采集軟件,文中的示例代碼講解詳細(xì),對(duì)我學(xué)習(xí)或工作有一定參考價(jià)值,感興趣的可以了解一下2022-07-07
C++深入講解對(duì)象的銷(xiāo)毀之析構(gòu)函數(shù)
構(gòu)造函數(shù)在創(chuàng)建對(duì)象時(shí)被系統(tǒng)自動(dòng)調(diào)用,而析構(gòu)函數(shù)(Destructor)在對(duì)象被撤銷(xiāo)時(shí)被自動(dòng)調(diào)用,相比構(gòu)造函數(shù),析構(gòu)函數(shù)要簡(jiǎn)單的多2022-04-04

