C/C++字符串处理(3):String ADT 字符串只是抽象数据类型

C/C++字符串处理(3):String ADT - 字符串只是抽象数据类型



许式伟
2008-3-26

概要

字符串是什么?我们认为,与其说它是一个类,不如说它只是一个ADT(抽象数据类型)。

目前C++中的字符串类

目前广泛采用的C++字符串类有二:std::string(basic_string,由STL提供)、CString(由MFC或者WTL提供)。它们的实现非常类似,都是带引用计数的、基于线性数据结构的字符串。不过SGI STL的Rope打破了这个规矩。它采用了一种基于树结构的组织方式来实现字符串。

如何理解字符串只是ADT?

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

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>是各种比较的算符,如==、!=、<、<=、>、>=等等。

关于这些方法的更详细说明,请参阅:

可变字符串(字符串操作类)

可变的字符串(字符串操作类)包含以上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);
};

当然,一个具体的字符串实现,会有其特殊支持的一些方法。这方面的详细资料,请参阅:

 
更多相关文章
  • 一. JS: https://github.com/hacke2/hacke2.github.io/issues/11 霸天 月刊   1.基础知识: http://www.zhihu.com/question/20979831 有哪些经常被误用的 HTML.JavaScript.CSS 的元素.方 ...
  • 什么是恶意软件? 本指南将术语"恶意软件"用作一个集合名词,来指代故意在计算机系统上执行恶意任务的病毒.蠕虫和特洛伊木马. 那么,计算机病毒或蠕虫的确切含义是什么?它们和特洛伊木马之间有哪些不同之处?防病毒应用程序是仅对蠕虫和特洛伊木马有效,还是仅对病毒有效? 所有这些问题都起源 ...
  • 关于百度定位 这是官方定位的解释:geolocation 地图插件配置 我在问答里面找到了这位童鞋的百度定位,地址变更提醒*** 不过,童鞋倒是给具体的示例啊,木有~~~~(>_<)~~~~ 官方的插件配置也看的懵懵懂懂,一塌糊涂 ok,自己搞,搞了大半天基本上弄清楚了,下面就总结一下自 ...
  • 由前一篇文章 http://www.cnblogs.com/darktime/p/3407980.html 我就配置了一个环境包,免安装的,只需要运行一个.bat的文件文件就算安装成功了 如果你需要用zend加密 配置zend guard loder 那么正好可以使用, 不用再管什么非线程安全 不用 ...
  • 以下是在iOS中最简单的界面切换示例.使用了多个Controller,并演示Controller之间在切换界面时的代码处理. 实现的应用界面: 首先,创建一个window-based application,即: 使用window-base application的目的是,尽量从最基本的情况下说明程 ...
  • uBuntu VirtualBox安装XP系统上网.共享文件以及U盘问题   uBuntu系统版本:12.10,其他版本方法雷同.   一.解决上网问题 在打开VirtualBox还没进入到XP时,设置NetWork: 网络类型:bridge(桥接) 驱动类型选择:Intel PRO/1000 T ...
一周排行
  • 工作的人都知道一个公司的核心文化就是执行力,今天我们在来谈谈执行力的重要性.我见过很多人买了<乔布斯告诉你如何成功>.<卡耐基黄金50年>,一般都是看看他们有哪些成功秘诀,个人感觉这些成功的人 ...
  • 转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/46697825一.Linux内核和发行版本 uname -a cat /etc/issue  二.glibc ...
  • 食材按周订购服务商Blue Apron刚获得一轮5万美元的C轮融资,公司估值已达5亿美元.Stripes Group领投了本轮融资,Bessemer Venture Partners和First Round Capi ...
  • //========================================================================//TITLE://    漫谈WinCE输入法的编写(一)//AU ...
  • 直接上代码,不要说话. ASP.NET MVC4过滤器的简单应用:验证登录 1 [AcceptVerbs(HttpVerbs.Post)] 2 public ActionResult login(FormCollec ...
  • xp系统安装版10分钟完成    XP系统是国内用户最常用的系统,所以许多用户都爱搜索"安装版xp系统下载",但是网络上提供的安装版xp系统体积都在00M,下载时间至少在一个小时以上.为 ...
  • 苏宁云商(002024.SZ)8月30日披露的2014年上半年报告显示,上半年实现营业收入为511.52亿元,同比下滑7.89%:归属于上市公司股东的净利润-7.55亿元,去年同期为盈利7.34亿元.业内人士分析认为 ...
  • 第一章  引言 第二章  预备知识 第三章  直接聚类法 第四章  K-means 第五章  DBSCAN 第六章  OPTICS 第七章 聚类分析的效果评测 第八章 数据尺度化问题 发表在 Science 上的一种 ...
  • 谋划重大资产重组的立思辰,在创下三个涨停后"歇脚".记者注意到,创业板开板一年,已有2家公司披露重大资产重组事项,另有多家公司投入数亿元进军新项目,利用超募资金"跑马圈地". ...
  • 近日有媒体报道称,中国移动广州分公司(以下简称广州移动)总经理李欣泽已于"五一"前夕被有关部门带走,目前尚不清楚具体原因.昨日 (5月2日),<每日经济新闻>记者致电广州移动新闻发言人 ...