C/C++字串處理之String ADT

來源:互聯網
上載者:User

概要

字串是什嗎?我們認為,與其說它是一個類,不如說它只是一個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>是各種比較的算符,如==、!=、<、<=、>、 >=等等。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.