資料結構剛開篇就是一種最基礎的儲存結構線性結構, 線性結構中每乙個結點都只有乙個前驅後繼(除去首尾)1. vector 成員的宣告和預設成員函式線性結構是邏輯上連續的儲存結構
物理空間上連續儲存的線性結構可以是陣列, 動態陣列等
物理空間不連續的線性結構是鍊錶
c++stl中的vector(動態陣列)就是乙個線性結構
templateclass vector
iterator end()
const_iterator cbegin() const
const_iterator cend() const
public:
vector() : _start(nullptr), _finish(nullptr), _endofstorage(nullptr){}
~vector()
}//vector v1(v2);
vector(const vector& v) : _start(nullptr), _finish(nullptr), _endofstorage(nullptr)
}// v1 = v2
vector& operator=(vectorv)
void swap(vector& v)
private:
iterator _start; // 指向資料起始
iterator _finish; // 指向資料末尾
iterator _endofstorage; // 指向空間末尾
};
sgi版stl庫中的vector實現的成員變數和資料結構中講的 (指標 size capacity) 不同,vector中用了三根指標
三個指標實現的效果和 (指標 size capacity 相同)
還有比較重要的一點是迭代器, vector的迭代器很簡單, 底層就是乙個原生指標, 迭代器的作用是讓上層不必要關心底層的實現直接使用迭代器操作容器.
這裡只實現了一種無參的預設建構函式, 將三個指標置空, 我們平時使用stl中的vector時, 常用的操作
vector v;
v.push_back(1);v.push_back(2);
所以就只實現了一種構造
拷貝構造和過載=, 因為要進行深拷貝, 必須自己手動實現,
過載= 使用了交換的 方式實現
下面是 常用的介面的實現, push_back, pop_back, operator, resize(), reserver()
push_back, 和 pop_back 是 o(1)的介面, 所以平時使用vector時要少用中間插入(搬移資料)
operator 因為物理空間是連續的所以vector支援隨機訪問, 也是乙個o(1)的介面
templateclass vector
const t& operator(size_t pos) const
size_t size() const
size_t capacity() const
void push_back(const t& x)
*_finish = x;
++_finish;
}void pop_back()
void resize(int n, const t& x = t())else }}
void reverse(int n)
}delete _start;
_start = tmp;
_finish = _start + size;
_endofstorage = _start + n;}}
};
push_back 首先要檢查空間是否夠用(是否初始化空間) 然後使用reverse增容
void insert(iterator pos, const t& x)
iterator begin = _finish;
while(begin != pos)
*pos = x;
++_finish;
}iterator earse(iterator pos)
--_finish;
return pos;
}
使用vector的insert 和 earse 時, 會有一種迭代器失效的現象, 具體情況一般是這樣:我們可以用我們的vector來研究一下迭代器失效的場景:首先是insert的分析1. earse必定失效(由編譯器決定是否中斷程式)
2. insert中如果發生擴容迭代器失效
迭代器失效一般發生在這種場景下:
vector v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
auto it = v.begin();
while (it != v.end())
pos = find(v.begin(), v.end(), 3);
v.insert(pos, 30);
cout << *pos; //增容會導致此處非法訪問
可以看出insert迭代器失效是因為內部的擴容, pos仍然指向舊的空間然後是earse導致迭代器失效的分析:
我們了解了迭代器失效的原理, 在今後寫**的過程中要避免迭代器失效.vector earse() 和 insert() 介面都需要搬移資料, 所以如果需要頻繁在中間插入刪除時, 不應該選用vector
C vector底層資料結構
vector 其底層資料結構是陣列,由於陣列的特點,vector也具有以下特性 1 o 1 時間的快速訪問 2 順序儲存,所以插入到非尾結點位置所需時間複雜度為o n 刪除也一樣 3 擴容規則 當我們新建乙個vector的時候,會首先分配給他一片連續的記憶體空間,如std vector vec,當通...
C vector資料結構容器常用操作 方法 函式
vector資料結構和陣列非常相似,也稱為單端陣列。vector與普通陣列區別 不同之處在於陣列是靜態空間,而vector可以動態擴充套件 所以vector宣告時不用指定大小,只用指定儲存元素的資料型別。動態擴充套件並不是在原空間之後續接新空間,而是找更大的記憶體空間,然後將原資料拷貝新空間,並釋放...
資料結構 資料結構緒論
資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...