快捷搜索:  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

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: