簡化版vector
參考書上敲了一個簡化版的vector,這裡的簡化主要是指沒有用模板去實現vector,而僅以基於string的vector這個範例來演示其內部的記憶體分配原理:
實現的功能有以下幾點:
- 實現了預先保留空間,其記憶體分配策略為擴大兩倍容量。
- 基於allocator實現了申請記憶體和初始化物件的分離。
- 使用move函式實現string的移動構造。
待實現的功能:
- 模板技術
- 引用計數
- 內部其他方法
程式碼如下:
#include <iostream>
#include <vector>
#include <allocators>
#include <string>
class MyVector {
public:
MyVector():first(nullptr),first_free(nullptr),last(nullptr){}
MyVector(const MyVector&v) {
pair<string*, string*> pir = alloc_copy(v.begin(), v.end());
first = pir.first;
first_free =last= pir.second;
};
MyVector &operator=(const MyVector&v) {
free();
auto data = alloc_copy(v.begin(), v.end());
first = data.first;
first_free = data.second;
return *this;
};
~MyVector() { free(); };
void push_back(const string& s) {
check_alloc();
alloc.construct(first_free++, s);
};
size_t size() const { return first_free - first; };
size_t capacity() const { return last - first; };
string *begin() const { return first; };
string *end() const { return first_free; };
private:
static allocator<string> alloc;
//allocator<string> alloc;
void check_alloc() {
//檢查容器是否已滿
if (size() == capacity())
reallocate();
}
//拷貝構造一段
pair<string*,string*> alloc_copy(string*begin, string*end) {
auto data = alloc.allocate(end - begin);
return make_pair(data, uninitialized_copy(begin, end, data));
}
//析構並釋放所有記憶體
void free() {
//不能給deallocate傳遞空指標
if (first) {
for (auto p = first; p != first_free;) {
alloc.destroy(p++);
}
alloc.deallocate(first, last - first);
}
};
void reallocate() {
//注意size為0的情況
int new_alloc = size()?capacity() * 2:1;
string *data_start = alloc.allocate(new_alloc);
string *temp_start = data_start;
string *temp_first = first;
for (size_t i = 0; i < size(); i++) {
alloc.construct(temp_start++, move(*temp_first++));
}
free();
first = data_start;
first_free = temp_start;
last = data_start + new_alloc;
}
string *first;
string *first_free;
string *last;
};
該類的私有屬性:
string *first 是指向動態陣列頭部的指標
string *first_free 是指向動態陣列已使用空間之後的第一個指標(即end)
string *last 是指向動態陣列可使用空間之後的一個指標
相關文章
- C++簡單vectorC++
- Vector3 類簡介
- C++ vector 列表初始化C++
- Swift基礎語法簡化版Swift
- Photoshop Elements 2023 for Mac(ps簡化版)21.0 啟用版Mac
- vector
- [開源]eCharts配置簡化包OptionCreator[typescript版]EchartsTypeScript
- 如何實現一個簡化版的 jQueryjQuery
- Photoshop Elements 2023 for Mac(ps簡化版) v21.0 啟用版Mac
- Vector Magic for mac(向量圖片轉換工具)1.2.0啟用版Mac
- 實現一個簡化版的vue-routerVue
- Vector Magic for mac 1.2.0免啟用版 向量圖片轉換工具Mac
- Paimon Deletion VectorAI
- c++ vectorC++
- Vector擴容
- vector——C++C++
- STL容器---Vector
- Support Vector MachinesMac
- vector 使用 上
- Vector和Stack
- [開源][示例更新]eCharts配置簡化包OptionCreator[typescript版]EchartsTypeScript
- C++ vector 元素數量變化不能使用範圍 forC++
- row_vector and col_vector的建立 (Leetcode 807, Leetcode 531)LeetCode
- 影片編輯軟體Premiere Elements 2024(Pr 2024簡化版)REM
- [簡易版]有向無環圖(DAG)前端視覺化前端視覺化
- python-Vector向量Python
- C++(std::vector)C++
- C++ Vector fundamentalC++
- C++ STL -- vectorC++
- vector::shrink_to_fit()
- C++:vector assignC++
- STL---vector(向量)
- vector的基本用法
- STL使用篇__vector
- Android中的VectorAndroid
- Vector 原始碼分析原始碼
- 《Python自動化運維快速入門(第2版)》簡介Python運維
- 精簡版 koa 簡單實現