?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

亞洲必贏App官方下:CC++字符串處理(3):String ADT字符串只是抽象數據類型

?

概要

字符串是什么?我們覺得,與其說它是一個類,不如說它只是一個ADT(抽象數據類型)。

今朝C++中的字符串類

今朝廣泛采納的C++字符串類有二:std::string(basic_string,由STL供給)、CString(由MFC或者WTL供給)。它們的實現異常類似,都是帶引用計數的、基于線性數據布局的字符串。不過SGI STL的Rope突破了這個規矩。它采納了一種基于樹布局的組織要領來實現字符串。

若何理解字符串只是ADT?

我們知道,基于值的容器主要有:

動態數組(std::vector)

雙向鏈表(std::list)

單向鏈表(std::slist,非STL標準)

雙向行列步隊(std::deque)

std::deque著實是分段繼續的、介于數組和鏈表之間的數據布局。這里不進行具體先容,關于std::deque的先容,請拜見這里。

這些容器都可以成為實現字符串的根基容器。例如,我們的StringBuilder基于std::vector實現;我們的TextPool基于std::deque實現。

大概你有疑問:是的,基于std::vector或者std::deque可以理解,然則,這世上有基于鏈表的字符串嗎?然而天下之大年夜,確鑿無奇不有。據“不完全”統計,多半函數式說話(如Erlang)確鑿采納單向鏈表實現字符串。

無論采納什么詳細的實現,著末我們都邑盡力去供給一個同等的字符串操作界面。以是,從這個意義上說,字符串只是一個ADT(抽象數據類型),它可以有多種實現,應用者按照詳細的需求選擇一種最相宜自己用況的字符串類。

字符串操作界面

在StdExt庫中,字符串這個ADT的規格定義如下:

常字符串

弗成變的字符串類,應該至少包孕以下措施:

template

concept ConstString

{

public:

typename value_type;

typename size_type, difference_type;

typename reference, const_reference;

typename iterator, const_iterator;

public:

iterator begin() const;

iterator end() const;

reverse_iterator rbegin() const;

reverse_iterator rend() const;

con亞洲必贏App官方下st_reference at(size_type i) const;

const_reference operator[](size_t亞洲必贏App官方下ype i) const;

size_type size() const;

bool empty() const;

basic_string stl_str() const; // 轉為STL string

public:

// 取字符串的字串

template

BasicString substr(

AllocT& alloc, size_type from = 0, size_type count = (size_type)-1) const;

public:

// 在字符串中查找子串(正向查找)。

iterator find(const TempString pattern, iterator from = begin()) const;

iterator find(const _E* pattern, size_type len, iterator from = begin()) const;

public:

// 在字符串中查找子串(反向查找)。

iterator rfind(const TempString pattern, iterator from = begin()) const;

iterator rfind(const _E* pattern, size_type len, iterator from = begin()) const;

public:

// 查找某個聚攏中的字符在字符串中第一次呈現的位置(正向查找)。

iterator find_first_of(

const TempString pattern, iterator from = begin()) const;

iterator find_first_of(

const _E* pattern, size_type len, iterator from = begin()) const;

public:

// 查找某個聚攏中的字符在字符串中第一次呈現的位置(反向查找)。

reverse_iterator find_last_of(

const TempString pattern, reverse_iterator from = rbegin()) const;

reverse_iterator find_last_of(

const _E* pattern, size_type len, reverse_iterator from = rbegin()) const;

public:

// 在字符串中查找不在聚攏中呈現的第一個字符的位置(正向查找)。

iterator find_first_not_of(

const TempString pattern, iterator from = begin()) const;

iterator find_first_not_of(

const _E* pattern, size_type len, iterator from = begin()) const;

public:

// 在字符串中查找不在聚攏中呈現的第一個字符的位置(反向查找)。

reverse_iterator find_last_not_of(

const TempString pattern, reverse_iterator from = rbegin()) const;

reverse_iterator find_last_not_of(

const _E* pattern, size_type len, reverse_iterator from = rbegin()) const;

public:

// 對照兩個字符串。

int compare(const TempString b) const;

int compare(const _E* 亞洲必贏App官方下b, size_type blen) const;

int compare(size_type from, size_type count, const TempString b) const;

int compare(size_type from, size_type count, const _E* b, size_type blen) const;

public:

// 對照兩個字符串(傳入單字符的對照函數)。

template

int compare_by(const TempString b, _Compr cmp) const;

template

int compare_by(const _E* b, size_type blen, _Compr cmp) const;

public:

// 對照兩個字符串(輕忽大年夜小寫)。

int icompare(const TempString b) const;

int icompar亞洲必贏App官方下e(const _E* b, size_type blen) const;

public:

// 判斷是否包孕指定的串。

bool contains(const TempString b) const;

bool contains(const _E* b, size_type blen) const;

public:

template

void trace(LogT& log) const; // 在log中顯示該字符串。

public:

// 互換兩個字符串

void swap(ConstString& b);

}

template  // 對照兩個字符串

bool operator(const ConstString& a, const ConstString& b);

// 這里是各類對照的算符,如==、!=、、>=等等。

關于這些措施的更具體闡明,請參閱:

TempString

String

可變字符串(字符串操作類)

可變的字符串(字符串操作類)包孕以上ConstString供給的所有措施,別的額外供給一些字符串改動相關的操作。一樣平常來講,可變的字符串至少滿意以下規格:

template

concept MutableString : public ConstString

{

public:

// 清空字符串

void clear();

public:

// 賦值操作(這里進行了真正的復制)

MutableString& assign(const TempString b);

MutableString& assign(const value_type* pszVal, size_type cch);

MutableString& assign(size_type count, value_type ch);

template

MutableString& assign(Iterator first, Iterator last);

MutableString& operator=(const TempString s);

public:

// 字符串連接

template

MutableString& append(Iterator first, Iterator last);

MutableString& append(const TempString s);

MutableString& append(const _E* s, size_type cch);

MutableString& append(size_type cch, _E ch);

MutableString& operator+=(const TempString s);

public:

// 插入

template

void insert(iterator it, Iterator first, Iterator last);

void insert(iterator it, const TempString s);

void insert(iterator it, const _E* s, size_type cch);

void insert(iterator it, size_type cch, _E ch);

public:

// 調換

template

MutableString& replace(

iterator firs亞洲必贏App官方下t, iterator last,

Iterator bfirst, Iterator blast);

template

MutableString& replace(

iterator first, iterator last, size_type count, _E ch);

MutableString& replace(

iterator first, iterator last, const _E* s, size_type cch);

MutableString& replace(

iterator first, iterator last, const TempString s);

};

當然,一個詳細的字符串實現,會有其特殊支持的一些措施。這方面的具體資料,請參閱:

StringBuilder

TextPool

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

快三平台开户