C vector總結(迭代器失效深度討論)

2021-09-26 03:01:13 字數 2661 閱讀 1810

vector的定義

建構函式宣告

介面說明

vector()(重點)

無參構造

vector(size_type n, const value_type& val = value_type())

構造並初始化n個val

vector (const vector& x); (重點)

拷貝構造

vector (inputiterator first, inputiterator last);

使用迭代器進行初始化構造

vector iterator 的使用

iterator的使用

介面說明

begin+end

end(重點)獲取第乙個資料位置的iterator/const_iterator, 獲取最後乙個資料的下乙個位置 的iterator/const_iterator

rbegin+rend

獲取最後乙個資料位置的reverse_iterator,獲取第乙個資料前乙個位置的 reverse_iterator

vector空間增長問題

容量空間

介面說明

size

獲取資料個數

capacity

獲取容量大小

empty

判斷是否為空

resize

改變vector的size

reserve

改變vector放入capacity

vector增刪查改

vector增刪查改

介面說明

push back

尾插pop back

尾刪find

查詢 (注意這個是演算法模組實現,不是vector的成員介面)

insert

在position之前插入val

erase

刪除position位置的資料

swap

交換兩個vector的資料空間

operator

像陣列一樣訪問

operator+index 和 c++11中vector的新式for+auto的遍歷

for (size_t i = 0; i < v.size(); ++i)

cout << v[i] << " ";

for(auto x : v)

cout<< x << " ";

交換兩個vector的資料空間

vectorswapv;    

swapv.swap(v); //交換了v和swapv的資料空間

迭代器失效場景總結:刪除pos迭代器位置所指向元素沒有及時給pos賦值,比如v.erase(pos)

可能會引起vector底層空間改變的操作,比如:push_back、insert、resize、reserve等

同樣的原因也會導致引用失效。因為引用和迭代器本質都是指標!!!

例如:

int a = ;    

vectorv(a, a + sizeof(a) / sizeof(int));

int &num=v[0];

v.push_back(1);

num=100;//這時會出現錯誤,原因類似。

earse函式並不會真正的判斷底層刪除的該塊記憶體是否真的失效了,例如刪除第乙個元素記憶體塊並不會失效,因為後面的元素整體向前移動了。但是在stl底層系統預設了只要呼叫erase函式都會導致迭代器失效,這樣減少了判斷是否失效了那部分**,減低了**的複雜度!!!

int a = ;    

vectorv(a, a + sizeof(a) / sizeof(int));

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

vector::iterator pos = find(v.begin(), v.end(), 3);

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

v.erase(pos); //正確使用 pos = v.erase(pos);

cout << *pos << endl; // 此處會導致非法訪問

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

// insert會導致迭代器失效,是因為insert可能會導致增容,增容後pos還指向原來的空間,而原來的空間已經釋放了。

pos = find(v.begin(), v.end(), 3);

v.insert(pos, 30); //正確使用 pos = v.insert(pos,30);

cout << *pos << endl; // 此處會導致非法訪問

C vector 迭代器失效原因

眾所周知,vector在記憶體中是順序儲存的,那麼當vector的長度增加時,也就是往裡面繼續pushback新的資料,當前塊的記憶體不夠,vector不得不重新申請一塊新的更大的記憶體,然後把之前的資料複製過來,再插入新的資料。為了驗證這個可以看看下面的測試 上面的 非常簡單,都是在插入乙個新的資...

迭代器失效 典型的迭代器失效

首先對於vector而言,新增和刪除操作可能使容器的部分或者全部迭代器失效。那為什麼迭代器會失效呢?vector元素在記憶體中是順序儲存,試想 如果當前容器中已經存在了10個元素,現在又要新增乙個元素到容器中,但是記憶體中緊跟在這10個元素後面沒有乙個空閒空間,而vector的元素必須順序儲存一邊索...

STL迭代器失效情況總結

define crt secure no warnings include include include include include include using namespace std void stl vector test cout it cout endl cout 插在迭代器指向的...