【stanford C++】容器III——Vector类
主要介紹如下5個(gè)容器類——Vector, Stack,Queue,Map和Set,各個(gè)都表示一重要的抽象數(shù)據(jù)類型。另外,各個(gè)類都是一些簡(jiǎn)單類型的值的集合,所以稱它們?yōu)槿萜黝悺?/strong>
?
暫且我們先不需要知道它們是如何實(shí)現(xiàn)的,我們先來(lái)學(xué)習(xí)一下如何使用它們。
?
為了能使用這些容器類,必須包含適合的接口,就像包含相應(yīng)的庫(kù)一樣。如下:
#include "vector.h"
就是包含了Vector類的接口,包含該頭文件后,就可以在程序中使用Vector類了。
?
一、Vector類
Vector類類似于C++中數(shù)組,然后,C++中數(shù)組有如下的缺點(diǎn):
- 數(shù)組在定義時(shí)指定其大小,后續(xù)不能改變。
 - 盡管數(shù)組有固定的大小,但是程序員不能獲取該大小。結(jié)果就是,需要一個(gè)額外的變量來(lái)跟蹤數(shù)組中的元素?cái)?shù)目。
 - 傳統(tǒng)的數(shù)組不支持插入和刪除元素。
 - C++中數(shù)組不能確保你選擇的數(shù)據(jù)一定存在于數(shù)組中,例如,當(dāng)一個(gè)數(shù)組保存了25個(gè)元素,當(dāng)要選擇索引為50的位置的元素時(shí),C++將簡(jiǎn)單的查看內(nèi)存位置,若存在則就查看到。
 
Vector類通過(guò)抽象數(shù)據(jù)類型來(lái)重新實(shí)現(xiàn)數(shù)組概念來(lái)解決這些問(wèn)題,
1.指定Vector的基本類型
如Vector<int>表示一個(gè)Vector,其元素是整型。
Vector<char>表示一個(gè)Vector,其元素是單個(gè)字符
Vecotr<string>表示一個(gè)Vector,其元素是字符串。
尖括號(hào)里的類型,就表示為指定容器類的基本類型(Base Type)。
?
這種類中包含指定的基本類型在面向?qū)ο笊鐓^(qū)中稱為參數(shù)化的類。在C++中,參數(shù)化的類另外稱為模板(templates)。這反映了C++編譯器把Vector<int>,Vector<char>,Vector<string>作為獨(dú)立的類來(lái)共享共同的結(jié)構(gòu)。
?
2.聲明一個(gè)Vector對(duì)象
抽象數(shù)據(jù)類型背后的一個(gè)哲學(xué)原理是讓Client認(rèn)為它們就是內(nèi)置的原始類型,就像如下聲明一個(gè)整型變量一樣
int n;
聲明一個(gè)新的Vector變量寫(xiě)為:
Vecotr<int> vec;
在C++中,該聲明的新變量vec,表示是一個(gè)整型的Vector。
?
3.Vector操作
1)add操作
當(dāng)聲明一個(gè)Vector變量時(shí),其為一個(gè)空的Vector,表示它不包含任何元素,由于空的Vector并沒(méi)有用,因此,首先我知道的是如何向Vector變量中加入元素。常用的方法是調(diào)用add方法,該方法是在Vector尾部加入一個(gè)新的元素。
例如,若vec是一個(gè)空的整型Vector,執(zhí)行如下加入元素操作:
vec.add(10);
vec.add(20);
vec.add(40);
這樣,vec中就包含了10,20,40這3個(gè)元素。現(xiàn)在vec看起來(lái)如下:
跟原始的數(shù)組類型不同,Vector類的大小不是固定的,這意味著我們?cè)谌魏螘r(shí)候加入其它元素。例如,現(xiàn)在我們?cè)偌尤胍粋€(gè)元素:
vec.add(50);
此時(shí),加入50到vec的尾部,如下:
?
2)insertAt方法
該方法允許在一個(gè)Vector類的中間位置加入一個(gè)元素,insertAt方法的第一個(gè)參數(shù)為索引號(hào),其表示在該索引號(hào)位置前插入一個(gè)新元素,例如:
vec.insertAt(2, 30);
表示在位置2之前插入一個(gè)值30,執(zhí)行該語(yǔ)句后,如下:
3)removeAt方法
該方法表示從Vector變量中刪除一個(gè)元素,例如:
vec.removeAt(0);
表示刪除位置0處的元素,執(zhí)行該語(yǔ)句后,如下:
4)get方法和set方法
get方法和set方法用來(lái)選擇和修改各個(gè)單獨(dú)的元素,get方法通過(guò)一個(gè)索引號(hào)獲取該索引位置的值。例如,對(duì)于上面最近顯示的vec變量中的值。調(diào)用
vec.get(2)
將返回40。
相應(yīng)地,可以使用set方法來(lái)改變已經(jīng)存在的元素的值,例如,調(diào)用
vec.set(3, 70);
其改變索引位置3的值50為70,如下:
?
get、set、insertAt和removeAt方法都會(huì)檢查給其提供的索引值必須是有效的。例如,對(duì)于上面最近顯示的Vector,若調(diào)用vec.get(4),則會(huì)有調(diào)用錯(cuò)誤,因?yàn)樗饕?太大了,因?yàn)関ector的索引值從0~3。
這種檢查索引值的操作是否有效的操作,稱之為邊界檢查。邊界檢查可以更容易的獲取到那些不容易注意的程序錯(cuò)誤
?
4.選擇Vector中的元素
盡管get和set方法容易使用,但并不是每個(gè)人都調(diào)用這些方法。
C++的一個(gè)特性是其定義的類可以重載標(biāo)準(zhǔn)操作符的定義。這讓Vector類支持更多傳統(tǒng)的使用方括號(hào)來(lái)指定要訪問(wèn)的索引的值的語(yǔ)法。
因此,選擇位置i處的元素,可以使用表達(dá)式vec[i],就像訪問(wèn)傳統(tǒng)的數(shù)組一樣。
另外,可以通過(guò)賦值一個(gè)新的值給vec[i]來(lái)改變位置i處的值。可以通過(guò)如下:
vec[3] = 70;
來(lái)設(shè)置索引值3的處為70。
?
最常用的索引表達(dá)式之一就是for循環(huán)中的索引,其按序循環(huán)各個(gè)索引值。循環(huán)Vector中的索引位置的通常模式如下:
for(int i = 0; i < vec.size(); i++)
{loop body
} 在循環(huán)實(shí)體內(nèi),可以應(yīng)用當(dāng)前的元素vec[i]。
例如,如下的代碼把Vec變量中的內(nèi)容,以方括號(hào)括起來(lái),元素之間用逗號(hào)隔開(kāi)來(lái)顯示
cout << "[";
for(int i = 0; i < vec.size(); i++)
{if(i > 0) cout << ",";cout << vec[i];
}
cout << "]" << endl; 執(zhí)行該段代碼的輸出結(jié)果將如下:
[20,30,40,70]
?
5.傳遞Vector對(duì)象作為一個(gè)參數(shù)
對(duì)于上面的打印Vector變量中的元素值使用的非常頻繁,因此,可以把其定義為一個(gè)函數(shù),后面若使用,直接調(diào)用該函數(shù)即可,那么在定義函數(shù)時(shí),就涉及了Vector變量傳遞給函數(shù)參數(shù)的問(wèn)題,一般Vector變量作為函數(shù)參數(shù)的定義如下:
void printVector(Vector<int> &vec)
{cout << "[";for(int i = 0; i < vec.size(); i++){if(i > 0) cout << ",";cout << vec[i];}cout << "]" << endl;
} 
 &表示此處參數(shù)通過(guò)引用來(lái)調(diào)用,
在C++中,引用調(diào)用比傳值調(diào)用更有效,因?yàn)閭髦嫡{(diào)用要求復(fù)制vector中的每個(gè)元素。
在printVector函數(shù)中,并沒(méi)需要進(jìn)行復(fù)制,所以引用調(diào)用是一個(gè)更加有效的設(shè)計(jì)。
?
引用調(diào)用的一個(gè)更加重要的特性就是可以直接改變Vector變量中的內(nèi)容,例如,使用如何函數(shù)刪除元素值為0的項(xiàng)。
void removeZeroElements(Vector<int> &vec){for(int i = vec.size() - 1; i >= 0; i--)if(vec[i] == 0)vec.removeAt(i);}
} 
 6.創(chuàng)建一個(gè)預(yù)先定義大小的Vector
到目前為止的例子,都是創(chuàng)建一個(gè)空Vector變量,然后一次加入一個(gè)元素到里面。然而,若提前知道要?jiǎng)?chuàng)建的vector變量的大小,則可以在聲明時(shí)指定元素個(gè)數(shù)。如下代碼:
const int N_HOLES = 18;
Vector<int> golfScores;
for(int i = 0; i < N_HOLES; i++)
{golfScores.add(0);
} 一個(gè)較好的方法是在聲明的時(shí)候包含一個(gè)大小的參數(shù),如下:
Vector<int> golfScores(N_HOLES);
該聲明創(chuàng)建一個(gè)Vector<int>變量指定大小為N_HOLES個(gè)元素,各個(gè)元素初始化為0.
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/snake-hand/p/3206532.html
總結(jié)
以上是生活随笔為你收集整理的【stanford C++】容器III——Vector类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: 同余与模运算
 - 下一篇: 患难夫妻下一句是什么啊?