寫在前言:這是一道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了。其實這也簡單,只需將實現該功能的程式 做成子程式,...