初步了解vector

2021-10-01 12:26:49 字數 4838 閱讀 6642

一、vector的介紹

vector是表示可變大小陣列的序列容器。

就像陣列一樣,vector也採用的連續儲存空間來儲存元素。也就是意味著可以採用下標對vector的元素

進行訪問,和陣列一樣高效。但是又不像陣列,它的大小是可以動態改變的,而且它的大小會被容器自

動處理。

本質講,vector使用動態分配陣列來儲存它的元素。當新元素插入時候,這個陣列需要被重新分配大小

為了增加儲存空間。其做法是,分配乙個新的陣列,然後將全部元素移到這個陣列。就時間而言,這是

乙個相對代價高的任務,因為每當乙個新的元素加入到容器的時候,vector並不會每次都重新分配大

小。vector分配空間策略:vector會分配一些額外的空間以適應可能的增長,因為儲存空間比實際需要的存

儲空間更大。不同的庫採用不同的策略權衡空間的使用和重新分配。但是無論如何,重新分配都應該是

對數增長的間隔大小,以至於在末尾插入乙個元素的時候是在常數時間的複雜度完成的。

因此,vector占用了更多的儲存空間,為了獲得管理儲存空間的能力,並且以一種有效的方式動態增

長。與其它動態序列容器相比(deques, lists and forward_lists), vector在訪問元素的時候更加高效,在

末尾新增和刪除元素相對高效。對於其它不在末尾的刪除和插入操作,效率更低。比起lists和

forward_lists統一的迭代器和引用更好。

二、vector的介面

|介面名 | 介面說明 |

|–|--|

| begin | 獲取第乙個資料位置 |

| end | 獲取最後乙個元素的下乙個位置 |

|rbegin | 獲取最後一元素的下乙個位置 |

|rend | 獲取第乙個元素的位置 |

| size |獲取資料個數 |

|capacity | 獲取容量大小 |

| empty |判斷是否為空 |

| resize |改變vector的size |

|reserve |改變vector的capacity |

|push_back | 尾插 |

|pop_back |尾刪 |

|find |查詢 |

| insert |在position之前插入val |

| erase |刪除position位置的資料 |

| swap | 交換兩個vector的資料空間 |

| operator | 像陣列一樣訪問 |

vector迭代器失效問題:刪除元素會導致此處的空間不屬於vector,但你訪問這個位置的元素就會導致非法訪問、在插入元素的時候有可能會導致增容,但是vector的增容原理是在其他地方開闢乙個更大的空間再將原來vector的元素重新賦值過去、這樣就會導致迭代器訪問的是原來的空間、就會導致非法訪問。

eg:

#include

#include

#include

using

namespace std;

intmain()

; vector<

int>

v(a, a +

sizeof

(a)/

sizeof

(int))

;// 使用find查詢3所在位置的iterator

vector<

int>

::iterator pos =

find

(v.begin()

, v.

end(),

3);// 刪除pos位置的資料,導致pos迭代器失效。

v.erase

(pos)

; cout <<

*pos << endl;

// 此處會導致非法訪問

// 在pos位置插入資料,導致pos迭代器失效。

// insert會導致迭代器失效,是因為insert可

// 能會導致增容,增容後pos還指向原來的空間,而原來的空間已經釋放了。

pos =

find

(v.begin()

, v.

end(),

3); v.

insert

(pos,30)

; cout <<

*pos << endl;

// 此處會導致非法訪問

return0;

}

三、vector的模擬實現

using

namespace std;

#include

// 注意這裡namespace大家下去就不要取名為bit了,否則出去容易翻車。^^

namespace bit

iterator end()

const_iterator cbegin()

const

const_iterator cend()

const

// construct and destroy

vector()

:_start

(nullptr),

_finish

(nullptr),

_endofstorage

(nullptr

)vector

(int n,

const t& value =t(

)):_start

(nullptr),

_finish

(nullptr

)using

namespace std;

#include

// 注意這裡namespace大家下去就不要取名為bit了,否則出去容易翻車。^^

namespace bit

iterator end()

const_iterator cbegin()

const

const_iterator cend()

const

// construct and destroy

vector()

:_start

(nullptr),

_finish

(nullptr),

_endofstorage

(nullptr

)vector

(int n,

const t& value =t(

)):_start

(nullptr),

_finish

(nullptr)}

vector

(const vector

& v)

位元科技

:_start

(nullptr),

_finish

(nullptr),

_endofstorage

(nullptr

) _finish = _start + v.

size()

; _endofstorage = _start + v.

capacity()

;}vector

&operator

=(vector v)

~vector()

// capacity

size_t size()

const

size_t capacity()

const

void

reserve

(size_t n)

_start = tmp;

_finish = _start + size;

_endofstorage = _start + n;}}

void

resize

(size_t n,

const t& value =t(

))// 2.空間不夠則增容

if(n >

capacity()

)reserve

(n);

// 3.將size擴大到n

iterator it = _finish;

iterator _finish = _start + n;

while

(it != _finish)

}///access///

t&operator

(size_t pos)

const t&

operator

(size_t pos)

const

///modify/

void

push_back

(const t& x)

void

pop_back()

void

swap

(vector

& v)

iterator insert

(iterator pos,

const t& x)

iterator end = _finish -1;

while

(end >= pos)

*pos = x;

++_finish;

return pos;

}// 返回刪除資料的下乙個資料

// 方便解決:一邊遍歷一邊刪除的迭代器失效問題

iterator erase

(iterator pos)

--_finish;

return pos;

}private

: iterator _start;

// 指向資料塊的開始

iterator _finish;

// 指向有效資料的尾

iterator _endofstorage;

// 指向儲存容量的尾

};

C Boost 初步了解

boost是由c 標準委員會成員發起 眾多c 業界高人參與設計並實現的乙個涉及面廣 質量高且業已廣泛使用的c 標準後備庫,其中 tr1已經被納入c 0x標準庫。不論從風格和內容組織上講,都可以認為boost專案是c 標準庫的延伸。截止到boost 1.43版本,boost專案擁有大約100個用途廣泛...

jquery 初步了解

js 建立函式有以下三種方法 1 函式關鍵字 function foo x 2 匿名函式 var func function x 3 建構函式 var func new function x alert x 建構函式每次執行時都解析函式主題 頻繁呼叫建構函式效率很低 並且建構函式不能遞迴使用 關鍵字...

Tomcat初步了解

http協議預設的埠號為80,如果伺服器的埠號為80,則url中的埠號可以省略,否則必須使用冒號加埠號指明埠。tomcat的埠號可在g soft apache tomcat 7.0.59 conf server.xml檔案中配置 訪問本機tomcat伺服器的方式 2.3.http 本機ip 8080...