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 插在迭代器指向的...