青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

面對現實,超越自己
逆水行舟,不進則退
posts - 269,comments - 32,trackbacks - 0

C++ Vector(向量容器)

是一個線性順序結構。相當于數組,但其大小可以不預先指定,并且自動擴展。它可以像數組一樣被操作,由于它的特性我們完全可以將vector 看作動態數組。

在創建一個vector 后,它會自動在內存中分配一塊連續的內存空間進行數據存儲,初始的空間大小可以預先指定也可以由vector 默認指定,這個大小即capacity ()函數的返回值。當存儲的數據超過分配的空間時vector 會重新分配一塊內存塊,但這樣的分配是很耗時的,在重新分配空間時它會做這樣的動作:

首先,vector 會申請一塊更大的內存塊;

然后,將原來的數據拷貝到新的內存塊中;

其次,銷毀掉原內存塊中的對象(調用對象的析構函數);

最后,將原來的內存空間釋放掉。

如果vector 保存的數據量很大時,這樣的操作一定會導致糟糕的性能(這也是vector 被設計成比較容易拷貝的值類型的原因)。所以說vector 不是在什么情況下性能都好,只有在預先知道它大小的情況下vector 的性能才是最優的。

 

vector 的特點:

(1) 指定一塊如同數組一樣的連續存儲,但空間可以動態擴展。即它可以像數組一樣操作,并且可以進行動態操作。通常體現在push_back() pop_back()

(2) 隨機訪問方便,它像數組一樣被訪問,即支持[ ] 操作符和vector.at()

(3) 節省空間,因為它是連續存儲,在存儲數據的區域都是沒有被浪費的,但是要明確一點vector 大多情況下并不是滿存的,在未存儲的區域實際是浪費的。

(4) 在內部進行插入、刪除操作效率非常低,這樣的操作基本上是被禁止的。Vector 被設計成只能在后端進行追加和刪除操作,其原因是vector 內部的實現是按照順序表的原理。

(5) 只能在vector 的最后進行push pop ,不能在vector 的頭進行push pop

(6) 當動態添加的數據超過vector 默認分配的大小時要進行內存的重新分配、拷貝與釋放,這個操作非常消耗性能。 所以要vector 達到最優的性能,最好在創建vector 時就指定其空間大小。

Vectors 包含著一系列連續存儲的元素,其行為和數組類似。訪問Vector中的任意元素或從末尾添加元素都可以在常量級時間復雜度內完成,而查找特定值的元素所處的位置或是在Vector中插入元素則是線性時間復雜度。

 

1.Constructors 構造函數

vector<int> v1; //構造一個空的vector

vector<int> v1( 5, 42 ); //構造了一個包含5個值為42的元素的Vector

2.Operators 對vector進行賦值或比較

C++ Vectors能夠使用標準運算符: ==, !=, <=, >=, <, 和 >.

要訪問vector中的某特定位置的元素可以使用 [] 操作符.

兩個vectors被認為是相等的,如果:

1.它們具有相同的容量

2.所有相同位置的元素相等.

vectors之間大小的比較是按照詞典規則.

3.assign() 對Vector中的元素賦值

語法:

void assign( input_iterator start, input_iterator end );

// 將區間[start, end)的元素賦到當前vector

void assign( size_type num, const TYPE &val );

// 賦num個值為val的元素到vector中,這個函數將會清除掉為vector賦值以前的內容。

4.at() 返回指定位置的元素

語法:

TYPE at( size_type loc );//差不多等同v[i];但比v[i]安全;

5.back() 返回最末一個元素

6.begin() 返回第一個元素的迭代器

7.capacity() 返回vector所能容納的元素數量(在不重新分配內存的情況下)

8.clear() 清空所有元素

9.empty() 判斷Vector是否為空(返回true時為空)

10.end() 返回最末元素的迭代器(譯注:實指向最末元素的下一個位置)

11.erase() 刪除指定元素

語法:

iterator erase( iterator loc );//刪除loc處的元素

iterator erase( iterator start, iterator end );//刪除start和end之間的元素

12.front() 返回第一個元素的引用

13.get_allocator() 返回vector的內存分配器

14.insert() 插入元素到Vector中

語法:

iterator insert( iterator loc, const TYPE &val );

//在指定位置loc前插入值為val的元素,返回指向這個元素的迭代器,

void insert( iterator loc, size_type num, const TYPE &val );

//在指定位置loc前插入num個值為val的元素

void insert( iterator loc, input_iterator start, input_iterator end );

//在指定位置loc前插入區間[start, end)的所有元素

15.max_size() 返回Vector所能容納元素的最大數量(上限)

16.pop_back() 移除最后一個元素

17.push_back() 在Vector最后添加一個元素

18.rbegin() 返回Vector尾部的逆迭代器

19.rend() 返回Vector起始的逆迭代器

20.reserve() 設置Vector最小的元素容納數量

//為當前vector預留至少共容納size個元素的空間

21.resize() 改變Vector元素數量的大小

語法:

void resize( size_type size, TYPE val );

//改變當前vector的大小為size,且對新創建的元素賦值val

22.size() 返回Vector元素數量的大小

23.swap() 交換兩個Vector

語法:

void swap( vector &from );

 

 Vector用法 :

1.聲明:

一個vector類似于一個動態的一維數組。

vector<int> a; //聲明一個元素為int類型的vector a

vectot<MyType> a; //聲明一個元素為MyType類型的vector a

這里的聲明的a包含0個元素,既a.size()的值為0,但它是動態的,其大小會隨著數據的插入和刪除改變而改變。

vector<int> a(100, 0); //這里聲明的是一個已經存放了100個0的整數vector

你可以用以下的幾種方法聲明一個 vector 對象:

vector<float> v(5, 3.25); //初始化有5 個元素,其值都是3.25

vector<float> v_new1(v);

vector<float> v_new2 = v;

vector<float> v_new3(v.begin(), v.end());

這四個vector 對象是相等的,可以用operator==來判斷。

2.向量操作

常用函數:

size_t size(); // 返回vector的大小,即包含的元素個數

void pop_back(); // 刪除vector末尾的元素,vector大小相應減一

void push_back(); //用于在vector的末尾添加元素

T back(); // 返回vector末尾的元素

void clear(); // 將vector清空,vector大小變為0

其他訪問方式:

cout<<a[5]<<endl;

cout<<a.at(5)<<endl;

以上區別在于后者在訪問越界時會拋出異常,而前者不會。

3.遍歷

(1). for(vector<datatype>::iterator it=a.begin(); it!=a.end();it++)

cout<<*it<<endl;

(2). for(int i=0;i<a.size;i++)

cout<<a[i]<<endl;

 

現在想得到容器中能保存的最大元素數量就可以用 vector 類的成員函數max_size():

vector<shape>::size_type max_size = my_shapes.max_size();

當前容器的實際尺寸 --- 已有的元素個數用size():

vector<shape>::size_type size = my_shapes.size();

就像size_type 描述了vector 尺寸的類型,value_type 說明了其中保存的對象的類型:

cout << “value type: “ << typeid(vector<float>::value_type).name();

輸出:

value type: float

可以用capacity()來取得vector 中已分配內存的元素個數:

vector<int> v;

vector<int>::size_type capacity = v.capacity();

vector 類似于數組,可以使用下標[]訪問:

vector<int> v(10);

v[0] = 101;

注意到這里預先給10 個元素分配了空間。你也可以使用vector 提供的插入函數來動態的擴

展容器。成員函數push_back()就在vector 的尾部添加了一個元素:

v.push_back(3);

也可以用insert()函數完成同樣的工作:

v.insert(v.end(), 3);

這里insert()成員函數需要兩個參數:一個指向容器中指定位置的迭代器(iterator),一個待插

入的元素。insert()將元素插入到迭代器指定元素之前。

現在對迭代器(Iterator)做點解釋。Iterator 是指針(pointer)的泛化,iterator 要求定義

operator*,它返回指定類型的值。Iterator 常常和容器聯系在一起。例子:

vector<int> v(3);

v[0] = 5;

v[1] = 2;

v[2] = 7;

 

vector<int>::iterator first = v.begin();

vector<int>::iterator last = v.end();

while (first != last)

cout << *first++ << “ “;

上面代碼的輸出是:

5 2 7

begin()返回的是vector 中第一個元素的iterator,而end()返回的并不是最后一個元素的

iterator,而是past the last element。在STL 中叫past-the-end iterator

組合查找
vector<int>::iterator result = find( v.begin( ), v.end( ), 2 ); //查找2
if ( result == v.end( ) ) //沒找到
        cout << "No" << endl;
 else //找到
        cout << "Yes" << endl;


 

posted on 2012-06-04 09:18 王海光 閱讀(11065) 評論(0)  編輯 收藏 引用 所屬分類: STL
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            老鸭窝91久久精品色噜噜导演| 欧美日韩亚洲国产精品| 美日韩精品视频| 亚洲欧美成人一区二区三区| 一区在线观看视频| 久久精品三级| 国产精品你懂的在线| 欧美极品一区二区三区| 免费成人在线视频网站| 久久野战av| 免费高清在线一区| 久久夜色撩人精品| 久久偷窥视频| 免费观看日韩| 欧美v亚洲v综合ⅴ国产v| 老司机午夜精品| 欧美阿v一级看视频| 欧美极品在线观看| 久久久久久久综合| 久色成人在线| 欧美日韩第一区日日骚| 国产精品mv在线观看| 国产精品天天看| 韩国一区电影| 亚洲激情在线观看视频免费| 亚洲精品你懂的| 亚洲一区亚洲二区| 欧美中文在线字幕| 欧美va亚洲va国产综合| 亚洲人成网站777色婷婷| 亚洲人被黑人高潮完整版| 欧美a级大片| 亚洲美女中文字幕| 欧美亚洲综合在线| 免费观看久久久4p| 国产精品剧情在线亚洲| 极品少妇一区二区| 亚洲九九九在线观看| 99国内精品| 久久不射电影网| 亚洲国产精品一区二区第一页| 亚洲精品一区二区三区在线观看 | 美女精品网站| 欧美日韩亚洲一区| 国产午夜精品一区二区三区视频| 亚洲成色777777女色窝| 亚洲欧洲三级| 久久精品国产一区二区三| 亚洲福利视频二区| 欧美亚洲一级片| 欧美久久综合| 精品成人一区二区| 在线观看国产一区二区| 亚洲一区二区三区四区在线观看| 久久视频一区| 亚洲视频免费看| 久久综合精品一区| 欧美片网站免费| 午夜影视日本亚洲欧洲精品| 国产一区二区三区日韩| 日韩视频一区| 模特精品在线| 欧美亚洲自偷自偷| 国产精品igao视频网网址不卡日韩| 在线精品亚洲一区二区| 欧美一区二区三区男人的天堂| 亚洲高清三级视频| 欧美一级视频精品观看| 欧美成人国产一区二区| 国产精品久久久久久久浪潮网站 | 久久天天狠狠| 国产欧美日韩亚洲| 亚洲欧美一区二区三区在线| 另类春色校园亚洲| 欧美亚洲一区在线| 国产日韩在线不卡| 亚洲欧美国产高清va在线播| 亚洲精品一区在线观看香蕉| 午夜精品电影| 国产欧美精品日韩| 久久动漫亚洲| 午夜精品美女自拍福到在线| 国产精品久久看| 亚洲激情亚洲| 91久久一区二区| 欧美人妖另类| 亚洲欧美不卡| 亚洲亚洲精品三区日韩精品在线视频| 欧美日韩成人综合天天影院| 亚洲美女视频在线观看| 亚洲黄色性网站| 欧美巨乳波霸| 亚洲综合精品四区| 欧美一区二区免费观在线| 国产日韩一区二区三区在线| 久久久一本精品99久久精品66| 久久九九精品99国产精品| 91久久国产综合久久91精品网站| 夜夜嗨av色一区二区不卡| 国产主播一区二区三区| 亚洲精品欧美极品| 黄色小说综合网站| 一区二区高清在线观看| 尤物精品国产第一福利三区| 一本色道久久综合亚洲二区三区| 国模大胆一区二区三区| 99国产精品久久久| 亚洲高清不卡在线观看| 亚洲午夜精品久久久久久app| 亚洲成人直播| 西西人体一区二区| 亚洲社区在线观看| 美腿丝袜亚洲色图| 久久婷婷国产麻豆91天堂| 国产精品高清在线| 在线视频免费在线观看一区二区| 亚洲欧美三级在线| 亚洲精品麻豆| 久久精品二区三区| 亚洲男人第一av网站| 欧美精品三区| 女人天堂亚洲aⅴ在线观看| 国产麻豆成人精品| 一区二区三区日韩欧美精品| 最新国产成人av网站网址麻豆| 亚洲欧美资源在线| 欧美亚洲三级| 国产精品白丝av嫩草影院| 亚洲精品色图| 日韩视频一区二区在线观看| 老妇喷水一区二区三区| 久久精品夜色噜噜亚洲a∨| 国产精品综合| 亚洲欧美中文日韩v在线观看| 亚洲嫩草精品久久| 国产精品久久久久久久久免费桃花| 99国产精品久久久| 亚洲视频每日更新| 欧美小视频在线| 在线综合亚洲| 小黄鸭精品aⅴ导航网站入口| 国产精品第十页| 亚洲影院色在线观看免费| 亚洲专区一二三| 国产老女人精品毛片久久| 亚洲欧美在线免费| 久久精品最新地址| 激情综合视频| 欧美激情女人20p| 日韩视频久久| 午夜精品久久| 精品不卡一区二区三区| 嫩模写真一区二区三区三州| 亚洲国产另类久久精品| 在线综合+亚洲+欧美中文字幕| 国产精品激情偷乱一区二区∴| 亚洲欧美日韩成人| 农夫在线精品视频免费观看| 亚洲精品国产精品乱码不99| 欧美日韩在线一区二区三区| 亚洲欧美国产另类| 欧美大片专区| 亚洲欧美在线高清| 亚洲第一视频网站| 欧美视频一区二区三区四区| 亚洲欧美一区二区三区在线| 美女脱光内衣内裤视频久久网站| 亚洲精品视频在线播放| 国产精品午夜在线| 麻豆亚洲精品| 亚洲无毛电影| 欧美激情第8页| 亚洲欧美日韩成人| 91久久精品国产91久久性色| 国产精品久久久久久久久久尿 | 欧美第一黄网免费网站| 一本大道久久a久久精二百| 国产精品日韩欧美一区二区| 久久久久91| 亚洲视频一区| 欧美成人一品| 午夜伦理片一区| 欧美+日本+国产+在线a∨观看| 一本久久a久久精品亚洲| 国产精品入口福利| 欧美高清视频免费观看| 欧美一区二区三区啪啪| 最近中文字幕mv在线一区二区三区四区| 亚洲午夜在线观看视频在线| 在线观看久久av| 国产色视频一区| 国产精品99一区二区| 免费久久99精品国产自在现线| 午夜精品影院| 亚洲一区二区精品| 亚洲国产成人在线| 欧美freesex交免费视频| 欧美自拍偷拍| 性欧美1819sex性高清| 中文精品在线|