vector是c++中的一種序列式容器,依靠其下標索引來訪問獲取容器內容。
vector和array同為序列式容器,其資料格式、操作等方面都十分相似,其最大不同點在於它們對於記憶體空間的使用。array是靜態陣列,使用者必須把握好其資料數量,一次性分配合理的記憶體空間。否則array會在新增新元素而空間不足時,其記憶體會經歷尋找更大的空間,複製到新空間,銷毀舊空間。這對記憶體的使用是非常不好的,而且效率低下。而vector是動態陣列,在新增新元素而舊空間不夠時雖然也會進行三個步驟,但系統進行了重新配置空間和資料移動的優化,其效率和安全性是比array高很多的。
vector的資料結構:
vector的底層是連續線性空間。它常使用兩個迭代器,begin(連續空間的第乙個元素位置)和end(超出元素末尾的第乙個元素位置),常用這兩個來表示已使用的空間範圍。還有乙個end_of_storage,表示其vector容器的整個空間末尾的元素位置。
vector的記憶體分配:
標準庫是以最小的代價來連續儲存元素。為了vector能實現快速的記憶體分配,其實際分配的會略多於當前所需的,即是end到end_of_storage。當這一段也用光,再有新元素加入的時候,會分配當前兩倍的空間。這個記憶體再擴大的過程會經歷尋找新空間、移動複製、釋放舊記憶體的三步曲,這樣會擴容之前的迭代器失效。
vector使用:
std::vector vec;
vec.clear() 移除容器中所有資料。
vec.empty() 判斷容器是否為空。
vec.erase(pos) 刪除pos位置的資料
vec.erase(beg,end) 刪除[beg,end]區間的資料
vec.front() 傳回第乙個資料。
vec.insert(pos,elem) 在pos位置插入乙個elem拷貝,而非替代。
vec.pop_back() 刪除最後乙個資料。
vec.push_back(elem) 在尾部插入乙個元素,而非替代。
vec.resize(num) 重新設定該容器的大小
vec.size() 回容器中實際資料的個數。
vec.begin() 返回指向容器第乙個元素的迭代器
vec.end() 返回指向容器最後乙個元素的迭代器
// 對於容器,使用迭代器操作容器中對應位置的值,當迭代器指向了容器中的某位置,則可以使用 * 加迭代器操作該位置了
std::vector myvec;
for(int j =0 ; j<10 ; j++)
std::vector::iterator p; // 定義乙個迭代器
p = myvec.begin(); // 指向容器的首個元素
p ++; // 移動到下乙個元素
*p = 20 ; // 修改該元素賦值,容器中的第二個值被修改為了20
vector< int > ivec( 10, 0 ); //定義了 ivec 它包含十個int型的元素 每個元素都被初始化為0。
int ia[ 6 ] = ;//對於內建陣列 我們可以顯式地把陣列的元素初始化為一組常量值。
對於vector不能顯式初始化,但是可以利用已存在的顯式陣列進行vector初始化賦值。
vector< int > ivec( ia, ia+5 );//定義int型別的vector,含有5個元素,將陣列ia內5個元素拷貝到vector進行初始化。
vector不能像陣列一樣直接用下標來進行賦值,只能通過iterator指向了那個下標的元素,然後改變其元素值。
資料結構之向量vector
這裡將借助stl的vector 向量 實現動態陣列,並用它來管理資料。函式功能 複雜度size 返回向量的元素數 o 1 push back x 在向量尾新增元素x o 1 pop back 刪除向量的最後乙個元素 o 1 begin 返回指向向量開頭的迭代器 o 1 end 返回指向向量尾的迭代器...
資料結構 vector
vector是不定長陣列,也就是說它的長度是不固定的,簡單地說就是 按需分配 這聽上去似乎有點麻煩,但在宣告陣列時如果我們並不清楚陣列的長度,並且簡單粗暴地使用 define maxn 1000000會導致記憶體失去了夢想 就算不,仍有大量的記憶體成了鹹魚。這個時候,我們就需要vector陣列。先看...
資料結構 向量 vector 陣列
從今天我的資料結構就開始了,多少次開始又放棄,現在鼓起勇氣決定走到底。我的內容是來自 資料結構與演算法分析 c 版 寫這些內容主要是為了回憶學過的內容,再次理解各種資料結構。我的計畫是這樣的 按照書上的內容實現基本內容,熟悉各種優缺點,然後用一段時間去做習題。因為我發現書中的習題特別好!注 向量的所...