資料結構C Vector

2021-09-24 11:21:50 字數 3499 閱讀 1634

資料結構剛開篇就是一種最基礎的儲存結構線性結構, 線性結構中每乙個結點都只有乙個前驅後繼(除去首尾)

線性結構是邏輯上連續的儲存結構

物理空間上連續儲存的線性結構可以是陣列, 動態陣列等

物理空間不連續的線性結構是鍊錶

c++stl中的vector(動態陣列)就是乙個線性結構

1. 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 時, 會有一種迭代器失效的現象, 具體情況一般是這樣:

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; //增容會導致此處非法訪問

我們可以用我們的vector來研究一下迭代器失效的場景:首先是insert的分析

可以看出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宣告時不用指定大小,只用指定儲存元素的資料型別。動態擴充套件並不是在原空間之後續接新空間,而是找更大的記憶體空間,然後將原資料拷貝新空間,並釋放...

資料結構 資料結構緒論

資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...