TempString: 临时字符串
概要
从逻辑上来讲,std::TempString是一个临时的std::String,它的规格应该和String完全一致,只是规定了特殊的生命周期。所谓临时,典型情况是作为函数的输入参数,在函数进入前生成,在退出函数时立即销毁。通常情况下,std::TempString不作其他用途。
但是从实现上来讲,std::TempString被作为String的基类,这只是为了实现上的方便。
规格
template <class _E> class TempString { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _E value_type; // pointer/reference 也是 const_pointer/const_reference,这和STL的string不太一样 typedef const _E* pointer/const_pointer; typedef const _E& reference/const_reference; // iteator/reverse_iterator 同样也是 const_iterator/const_reverse_iterator typedef const _E* iterator/const_iterator; typedef std::reverse_iterator<...> reverse_iterator/const_reverse_iterator; public: // 构造函数 TempString(); TempString(const _E& ch); TempString(const _E* szVal); TempString(const _E* szVal, size_t len); TempString(const std::basic_string<_E>& s); TempString(const std::vector<_E>& s); public: // attach一段内存,将其作为字符串。 // 其实这也是赋值(assign)操作,只是明确指出内存不进行复制。 void attach(const value_type* pszVal); void attach(const value_type* pszVal, size_type cch); public: template <class LogT> void trace(LogT& log) const; // 在log中显示该字符串。 public: void swap(TempString& b); // 交换两个字符串。 void clear(); // 将字符串清为空串。 void erase(); // 同clear()。 public: iterator begin() const; iterator end() const; reverse_iterator rbegin() const; reverse_iterator rend() const; public: const_reference at(size_type i) const; const_reference operator[](size_type i) const; public: const value_type* data() const; size_type length() const; size_type size() const; bool empty() const; public: basic_string<_E> stl_str() const; // 将String转为STL string。这个操作比较费时。 }; template <class AllocT, class _E> // 多个字符串连接。 BasicString<_E> concat(Alloc& alloc, TempString<_E> a1, TempString<_E> a2, ...);
_E
- 字符类型。如char、WCHAR等。
构造函数
TempString(const _E* szVal); TempString(const _E* szVal, size_t len); TempString(const std::basic_string<_E>& s); TempString(const std::vector<_E>& s); TempString(const BasicString<_E>& s);
- 由于TempString生命周期的特殊性,任意的线性内存字符串均可自由转换为TempString,这个转换是一个非常轻的操作。
attach - 关联一块内存
void attach(const value_type* pszVal); void attach(const value_type* pszVal, size_type cch);
- attach将一段内存视作字符串,关联到BasicString实例。其实这也是赋值(assign)操作,只是明确指出内存不进行复制。所以是一个非常轻的操作。
trace - 显示字符串
template <class LogT> void trace(LogT& log) const; // 在log中显示该字符串。
log
- 要显示字符的log终端实例。详情参见Log。
swap - 交换两个字符串
void swap(TempString& b); // 交换两个字符串。
clear/erase - 清空字符串
void clear(); // 将字符串清为空串。 void erase(); // 同clear()。
- 之所以有两个,纯粹是因为要兼容STL的普通容器习惯(clear)和STL string的习惯(erase)。
begin/end/rbegin/rend - 迭代器
iterator begin() const; iterator end() const; reverse_iterator rbegin() const; reverse_iterator rend() const;
at/operator[] - 取单个字符
const_reference at(size_type i) const; const_reference operator[](size_type i) const;
注意
- at和operator[]的行为是有细节差异的。按STL/boost的惯例,at操作会进行下标越界检查,在越界时将抛出std::out_of_range异常。而operator[]不进行越界检查。
data - 取字符串的数据指针
const value_type* data() const;
注意
- 记住一点:BasicString并不是以'\0'作为字符串结尾的。所以这里的data()函数必须配合下面取字符串长度的函数(length或者size)才有意义。
length/size - 取字符串的长度
size_type length() const; size_type size() const;
- 为什么会有两个?同clear/erase一样,纯粹是因为要兼容STL的普通容器习惯(size)和STL string的习惯(length)。
empty - 判断是否为空串
bool empty() const;
stl_str - 转为STL string
basic_string<_E> stl_str() const; // 将String转为STL string。这个操作比较费时。
concat - 字符串连接
template <class AllocT, class _E> // 多个字符串连接。 BasicString<_E> concat(AllocT& alloc, TempString<_E> a1, TempString<_E> a2, ...);
- concat并非是TempString类的成员函数。但它利用了TempString可以转换任意线性内存字符串(const _E*, std::basic_string<_E>, std::vector<_E>, BasicString<_E>等等)的能力,使得concat函数可以支持连接任意类型的线性内存字符串。如:
std::string hello = "Hello"; std::String space(" ", 1); std::vector<char> excalmatory_mark(3, '!'); std::String a = std::concat(alloc, hello, space, "world", excalmatory_mark);
相关参考
page_revision: 6, last_edited: 1206537502|%e %b %Y, %H:%M %Z (%O ago)





