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);

相关参考

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License