您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關c++中vector怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
1、插入數據
void push_back(const T& x)
在當前vector尾部插入x,如果容量不夠擴大二倍。
iterator insert(iterator pos, const T& x)
在POS位置插入元素x
2、容量相關
size_t capacity()
返回當前vector的容量(size+剩余容量)
size_t size()
返回當前vector的元素個數
void resize(size_t n, const T& val = T())
改變當前vector的size,如果n>size則大于部分初始值為val。(capacity的大小始終保持不變)
void reserve(size_t n)
改變當前vector的capacity,如果n<capacity則不改變。
3、刪除數據
void pop_back()
如果vector不為空,刪除當前vector的最后一個元素
iterator erase(iterator pos)
刪除POS位置的元素
4、運算符重載
T& operator[](size_t pos)
[]運算符重載,支持使用下標訪問vector
#include<iostream> #include<string.h> #include<assert.h> using namespace std; namespace myvector { template<class T> class vector { public: typedef T* iterator; iterator begin() { return start; } iterator end() { return finish; } //默認構造函數 vector() :start(nullptr) , finish(nullptr) , end_of_storage(nullptr) {} //容量 size_t capacity() { return end_of_storage - start; } size_t size() { return finish - start; } void reserve(size_t n) { if (n > capacity()) { //開新空間 T* tmp = new T[n]; //拷貝舊空間的內容 memcpy(tmp, start, sizeof(T)*size()); //改變容量 finish = tmp + size(); end_of_storage = tmp + n; //釋放舊空間 T* tmp1 = start; start = tmp; tmp = nullptr; } } void resize(size_t n, const T& val = T()) { //判斷容量 if (n > capacity()) reserve(n); //如果n<size if (n < size()) { finish = start + n; } else { while (finish != start + n) { *finish = val; finish++; } } } //檢查空間 void check_capacity() { if (finish == end_of_storage) { //如果當前不為空,就擴2倍,為空就開4個吧 size_t newcapacity = finish == nullptr ? 4 : capacity()*2; reserve(newcapacity); } } T& operator[](size_t pos) { assert(pos < size()); return start[pos]; } //插入 void push_back(const T& x) { insert(finish,x); } iterator insert(iterator pos, const T& x) { assert(pos >= start && pos <= finish); size_t pos1 = pos - start; check_capacity(); //解決迭代器失效 pos = start + pos1; //移動數據 iterator end = finish; while (end >= pos) { *(end + 1) = *end; end--; } //插入數據 *pos = x; finish++; return pos; } //刪除數據 void pop_back() { assert(finish > start); finish--; } iterator erase(iterator pos) { assert(pos >= start && pos < finish); iterator it = pos + 1; while (it != finish) { *(it - 1) = *it; ++it; } --finish; return pos; } //析構函數 ~vector() { delete[] start; start = finish = end_of_storage = nullptr; } private: iterator start; iterator finish; iterator end_of_storage; }; }
void test1() { //測試默認構造和析構函數 myvector::vector<int> v1; } void test2() { //測試push_back()、reserve、check_capacity、size、capacity myvector::vector<int> v2; //插入至少五個數據,進行一次擴容,擴容間接對size和capacity以及check_capacity進行了測試 v2.push_back(1); v2.push_back(2); v2.push_back(3); v2.push_back(4); //v2.push_back(5); for (size_t i = 0; i < v2.size(); i++) cout << v2[i] << " "; cout << endl; //測試resize,變小變大 v2.resize(8,6); for (size_t i = 0; i < v2.size(); i++) cout << v2[i] << " "; cout << endl; v2.resize(4); //測試[] //正常訪問 for (size_t i = 0; i < v2.size(); i++) cout << v2[i] << " "; cout << endl; //越界訪問 //cout << v2[v2.size()] << endl; //cout << v2[-1] << endl; //測試insert---將push_back使用insert插入也可以進行檢查 myvector::vector<int>::iterator it = v2.begin(); it = v2.insert(it,0); it = v2.insert(it + 2, 10); for (size_t i = 0; i < v2.size(); i++) cout << v2[i] << " "; cout << endl; //測試刪除 v2.pop_back(); v2.pop_back(); for (size_t i = 0; i < v2.size(); i++) cout << v2[i] << " "; cout << endl; v2.erase(v2.begin()); for (size_t i = 0; i < v2.size(); i++) cout << v2[i] << " "; cout << endl; }
1、在vector的接口中,使用insert插入數據時可能導致迭代器失效,具體如下
2、刪除操作導致迭代器失效
3、迭代器失效的解決辦法
1)在vector中,解決迭代器失效的辦法是在插入、刪除等可能會導致迭代器失效的地方,返回新的迭代器來解決迭代器失效。
關于“c++中vector怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。