概要
字符串是什麼?我們認為,與其說它是一個類,不如說它只是一個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 <class _E>
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;
const_reference at(size_type i) const;
const_reference operator[](size_type i) const;
size_type size() const;
bool empty() const;
basic_string<_E> stl_str() const; // 轉為STL string
public:
// 取字符串的字串
template <class AllocT>
BasicString<_E> substr(
AllocT& alloc, size_type from = 0, size_type count = (size_type)-1) const;
public:
// 在字符串中查找子串(正向查找)。
iterator find(const TempString<_E> pattern, iterator from = begin()) const;
iterator find(const _E* pattern, size_type len, iterator from = begin()) const;
public:
// 在字符串中查找子串(反向查找)。
iterator rfind(const TempString<_E> pattern, iterator from = begin()) const;
iterator rfind(const _E* pattern, size_type len, iterator from = begin()) const;
public:
// 查找某個集合中的字符在字符串中第一次出現的位置(正向查 找)。
iterator find_first_of(
const TempString<_E> 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<_E> 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<_E> 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<_E> 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<_E> b) const;
int compare(const _E* b, size_type blen) const;
int compare(size_type from, size_type count, const TempString<_E> b) const;
int compare(size_type from, size_type count, const _E* b, size_type blen) const;
public:
// 比較兩個字符串(傳入單字符的比較函數)。
template <class _Compr>
int compare_by(const TempString<_E> b, _Compr cmp) const;
template <class _Compr>
int compare_by(const _E* b, size_type blen, _Compr cmp) const;
public:
// 比較兩個字符串(忽略大小寫)。
int icompare(const TempString<_E> b) const;
int icompare(const _E* b, size_type blen) const;
public:
// 判斷是否包含指定的串。
bool contains(const TempString<_E> b) const;
bool contains(const _E* b, size_type blen) const;
public:
template <class LogT>
void trace(LogT& log) const; // 在log中顯示該字符串。
public:
// 交換兩個字符串
void swap(ConstString& b);
}
template <class _E> // 比較兩個字符串
bool operator<cmp>(const ConstString<_E>& a, const ConstString<_E>& b);
// 這裡<cmp>是各種比較的算符,如==、!=、<、<=、>、 >=等等。
關於這些方法的更詳細說明,請參閱:
TempString
String
可變字符串(字 符串操作類)
可變的字符串(字符串操作類)包含以上ConstString提供的所有方法,另外額外提供一些字符串修改相關 的操作。一般來講,可變的字符串至少滿足以下規格:
template <class _E>
concept MutableString : public ConstString<_E>
{
public:
// 清空字符串
void clear();
public:
// 賦值操作(這裡進行了真正的復制)
MutableString& assign(const TempString<_E> b);
MutableString& assign(const value_type* pszVal, size_type cch);
MutableString& assign(size_type count, value_type ch);
template <class Iterator>
MutableString& assign(Iterator first, Iterator last);
MutableString& operator=(const TempString<_E> s);
public:
// 字符串連接
template <class Iterator>
MutableString& append(Iterator first, Iterator last);
MutableString& append(const TempString<_E> s);
MutableString& append(const _E* s, size_type cch);
MutableString& append (size_type cch, _E ch);
MutableString& operator+=(const TempString<_E> s);
public:
// 插入
template <class Iterator>
void insert (iterator it, Iterator first, Iterator last);
void insert(iterator it, const TempString<_E> s);
void insert(iterator it, const _E* s, size_type cch);
void insert(iterator it, size_type cch, _E ch);
public:
// 替換
template <class Iterator>
MutableString& replace(
iterator first, iterator last,
Iterator bfirst, Iterator blast);
template <class _RandIterator>
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<_E> s);
};
當然,一個具體的字符串實現,會有其特殊支持的一些方法。這 方面的詳細資料,請參閱:
StringBuilder:
http://cpp.winxgui.com/cn:stringbuilder
TextPool:
http://cpp.winxgui.com/cn:textpool