底層結構
動態型別的資料表,可以存放任意型別的的元素;如vector< int>
vector成員變數:iterator_start;iterator_finish;iterator end_of_storage;
常用介面
1.建構函式宣告
void printvector(const vector& v)
cout << endl;
}int main()
cout << endl;
// 使用迭代器進行修改
it = v.begin();
while (it != v.end())
// 使用反向迭代器進行遍歷再列印
//vector::reverse_iterator rit = v.rbegin();
auto rit = v.rbegin();
while (rit != v.rend())
cout << endl;
printvector(v);
return 0;
}
3.容量操作
void reserve(size_t newcapacity):擴容;
4.vector增刪查改
// push_back/pop_back
#include #include using namespace std;
int main()
; vectorv(a, a + sizeof(a) / sizeof(int));
vector::iterator it = v.begin();
while (it != v.end())
cout << endl;
v.pop_back();
v.pop_back();
it = v.begin();
while (it != v.end())
cout << endl;
return 0;
}
// find / insert / erase
#include #include #include using namespace std;
int main()
; vectorv(a, a + sizeof(a) / sizeof(int));
// 使用find查詢3所在位置的iterator
vector::iterator pos = find(v.begin(), v.end(), 3);
// 在pos位置之前插入30
v.insert(pos, 30);
vector::iterator it = v.begin();
while (it != v.end())
cout << endl;
pos = find(v.begin(), v.end(), 3);
// 刪除pos位置的資料
v.erase(pos);
it = v.begin();
while (it != v.end())
cout << endl;
return 0;
}
// operator+index 和 c++11中vector的新式for+auto的遍歷
#include #include using namespace std;
int main()
; vectorv(a, a + sizeof(a) / sizeof(int));
// 通過讀寫第0個位置。
v[0] = 10;
cout << v[0] << endl;
// 通過[i]的方式遍歷vector
for (size_t i = 0; i < v.size(); ++i)
cout << v[i] << " ";
cout << endl;
vectorswapv;
swapv.swap(v);
cout << "v data:";
for (size_t i = 0; i < v.size(); ++i)
cout << v[i] << " ";
cout << endl;
cout << "swapv data:";
for (size_t i = 0; i < swapv.size(); ++i)
cout << swapv[i] << " ";
cout << endl;
// c++11支援的新式範圍for遍歷
for(auto x : v)
cout<< x << " ";
cout<迭代器失效
迭代器本質:實際就是乙個指標(string/vector),對指標進行封裝(list);
迭代器失效:指標失效,指標指向的空間不能訪問,指標指向的空間被釋放了;
vector什麼情況下會迭代器失效?
#include using namespace std;
#include int main()
; auto it = v.begin();// 將有效元素個數增加到100個,多出的位置使用8填充,操作期間底層會擴容
// v.resize(100, 8);
// reserve的作用就是改變擴容大小但不改變有效元素個數,操作期間可能會引起底層容量改變
// v.reserve(100);
// 插入元素期間,可能會引起擴容,而導致原空間被釋放
// v.insert(v.begin(), 0);
// v.push_back(8);
// 給vector重新賦值,可能會引起底層容量改變
v.assign(100, 8);
/* 出錯原因:以上操作,都有可能會導致vector擴容,也就是說vector底層原理舊空間被釋放掉,而在列印時,it還使用的是釋放之間的舊空間,在對it迭代器操作時,實際操作的是一塊已經被釋放的空間,而引起**執行時崩潰。
解決方式:在以上操作完成之後,如果想要繼續通過迭代器操作vector中的元素,只需給it重新賦值即可。
*/ while (it != v.end())
cout << endl;
return 0;
}
#include using namespace std;
#include int main()
; vectorv(a, a + sizeof(a) / sizeof(int));
// 使用find查詢3所在位置的iterator
vector::iterator pos = find(v.begin(), v.end(), 3);
// 刪除pos位置的資料,導致pos迭代器失效。
v.erase(pos);
cout << *pos << endl; // 此處會導致非法訪問
return 0;
}
erase刪除pos位置元素後,pos位置之後的元素會往前搬移,沒有導致底層空間的改變,理論上講迭代器不應該會失效,但是:如果pos剛好是最後乙個元素,刪完之後pos剛好是end的位置,而end位置是沒有元素的,那麼pos就失效了。因此刪除vector中任意位置上元素時,vs就認為該位置迭代器失效了。
如何解決:在任何有可能會引起迭代器失效的操作之後,如果要使用迭代器,必須給該迭代器重新賦值。
線性容器vector的使用
模板類vector是陣列的替代品,它是一種動態陣列,在內部自動使用new和delete來管理記憶體 所以也是自由儲存區 1.vector的遍歷 vectorvec的遍歷方式有 for int i 0 ifor iter vec.begin iter vec.end iter for each 2.v...
容器 Vector 的基本使用
v.push back value 代表向容器插入這種型別的資料 v.begin 指向容器的第乙個資料 v.end 指向容器的最後乙個資料的後乙個資料 include include include include using namespace std void myout int value i...
vector容器的使用方法
這個網上隨便都有啦,google一下,應有盡有。說明 vector 是一種動態陣列 是基本 陣列的類模板。其內部定義了很多基本操作。include 注意 標頭檔案沒有 h 構造 這個建構函式還有乙個可選的引數,這是乙個型別為 t的例項,描述了各個向量種各成員的初始值 如 vectorv2 init ...