C 採用allocator模板仿造string

2021-10-03 18:34:43 字數 2107 閱讀 5343

寫在前言:這是一道c++primer第五版第十三章的習題,13.44,都是按自己的感覺寫的,如有邏輯錯誤,請您不吝賜教!

進入正題:這個string支援標準庫string的基礎操作,比如+=操作、輸出操作、size()函式、capacity()函式、begin()函式、end()函式。

從頭分析,建構函式接受無參,也接受乙個const char*的字元指標,ptr遞增,指向str的尾部,相當於迭代器end()位置,呼叫alloac_begin_end函式,返回乙個pair型別,first成員指向首,second成員指向尾。直接輸出就呼叫《過載函式,呼叫show()函式直接輸出,如果進行+=操作,先判斷容量的大小是否夠新增的大小,如果不夠,呼叫reallocat(),重新分配大小,用allocate重新構建,construct新增以前所儲存的值,free()函式,釋放之前所保留的記憶體空間。大致的思路就是這樣的。

通過寫這個string類,終於理解當初的困惑,destroy函式–first_free目的不是把first_free減到first的位置,而是為了銷毀儲存的元素,重新構建也和–first_frr減到first的位置無關,重建是用allocate重新分配大小,construct新增元素,進而完成重建。

#ifndef string_h_included

#define string_h_included

#include

"dxgzg.h"

using std::allocator;

using std::cout;

using std::endl;

class

string}

std::pair<

char*,

char

*>

alloc_begin_end

(const

char

*c1,

const

char

*c2)

;//unitialized_copy返回值類似迭代器end的位置

}void

reallocat

(size_t num)

free()

;//釋放原先所指向的位址

first = newfirst;

first_free = newfirst_free;

end1 = first + newcapacity;

}public

:string()

:first

(nullptr),

first_free

(nullptr),

end1

(nullptr

)string

(const

char

*str)

auto pair_it =

alloc_begin_end

(str,ptr)

; first = pair_it.first;

first_free = end1 = pair_it.second;

}string

(const string& s)

string&

operator=(

const string& s)

string&

operator+=

(const string &str)

return

*this;}

~string()

void

free()

alloc.

deallocate

(first,end1-first);}

}void

show()

}char

*begin()

const

char

*end()

const

size_t size()

const

size_t capacity()

const};

std::ostream&

operator

<<

(std::ostream&out,string&s)

#endif

// !string_h_included

C 空間配置器 Allocator

東陽的學習筆記 空間配置器代表一種特定的記憶體模型,並提供一種抽象概念,以便將對記憶體的申請最終轉化為對記憶體的直接呼叫。就應用程式設計師來說,只需要傳入乙個 template 引數就可以了。配置器提供了乙個介面,包括分配 生成 銷毀和 物件。針對未初始化之記憶體的一些方便好用的函式強烈承諾 要麼全...

C 記憶體管理 之 初識allocator

allacator中文稱為 記憶體配置器 通常它是乙個類,負責提供記憶體管理 可能包含記憶體分配 釋放 自動 等能力 相關的服務。例如,我們通過c提供的malloc free即刻提供乙個allocator實作出來 class alloc 注意這裡有看似多餘的引數cb,這完全是為了和後續提供的allo...

ASP應用之模板採用

初學asp,程式是能勉強寫出來了,但若每進行一次 頁面的改版,所有的源程式都將進行一次移植手術。為此所耗費的人力精力不計其數,甚至一不小心得不償失 前功盡棄。所以,夢想著那麼大段的程式 變成幾個簡單的字元代替,這樣只要設計好頁面把該功能插入就ok了。其實這也簡單,只需將實現該功能的程式 做成子程式,...