博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

c++ string 到底是什么

Posted on 2016-03-30 21:34  bw_0927  阅读(325)  评论(0)    收藏  举报

http://www.cnblogs.com/zpcdbky/p/4470127.html

 

C++ string到底是什么?

要回答这个问题,先要了解什么是basic_string。
看一下basic_string的声明:

template < class charT,                          //定义字符串中字符的类型
           class traits = char_traits<charT>,    // basic_string::traits_type
           class Alloc = allocator<charT>        // basic_string::allocator_type
           > class basic_string;

可见,basic_string实质上是一个类模板。
再解释的稍微详细一些:

1.关于char_traits

声明:

template <class charT> struct char_traits;

作用:

Character traits classes specify character properties and provide specific semantics for certain operations on characters and sequences of characters.(来自C++ Referencce,地址:http://www.cplusplus.com/reference/string/char_traits/)

即:它指定了字符的属性,并且提供了作用在字符或字符序列上的某些操作的特定语义。

2.关于allocator

声明:

template <class T> class allocator;//<memory>头文件下   allocator:分配器

作用:
Allocators are classes that define memory models to be used by some parts of the Standard Library, and most specifically, by STL containers.(来自C++ Referencce,地址:http://www.cplusplus.com/reference/memory/allocator/?kw=allocator)
即:它定义了用于标准库的部分内容,特别是STL的内存模型。

现在我们来看string的声明:

typedef basic_string<char, char_traits<char>, allocator<char>> string;

现在,我们明白了,原来是这么回事:

用基本类型char实例化类模板basic_string,得到一个具体的模板类,然后,将其typedef为string。

换句话说,string本质上是一个模板类,就是basic_string<char, char_traits<char>, allocator<char>>,string是对应的“简称”。 直观地理解,string的实例对象(就是说 string str;中的str)是一个char序列,但不同于char* str,stingr str带有许多封装好的针对自己的操作。

ps:basic_string还有其它实例,比如说:

typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t>> wstring;

 

=========

http://www.cnblogs.com/zhiranok/archive/2011/12/08/stl_string_trim_split_replace.html

 

template< typename CharT >
    inline void TrimLeft(std::basic_string<CharT> &str)
    {
        str.erase(0, str.find_first_not_of(' '));
    }
 
    template< typename CharT >
    inline void TrimRight(std::basic_string<CharT> &str)
    {
        str.erase(str.find_last_not_of(' ') + 1);
    }
 
    template< typename CharT >
    inline void Trim(std::basic_string<CharT> &str)
    {
        str.erase(0, str.find_first_not_of(' '));
        str.erase(str.find_last_not_of(' ') + 1);
    }

  

template<typename CharT>
    inline void Erase(std::basic_string<CharT> &str, const CharT &charactor)
    {
        str.erase(remove_if(str.begin(), str.end(),
            bind2nd(std::equal_to<CharT>(), charactor)), str.end());
    }
 
    template<typename CharT>
    inline void Replace(std::basic_string<CharT> &str, const std::basic_string<CharT> &strObj, const std::basic_string<CharT> &strDest)
    {
        while(true)
        {
            CharT pos = str.find(strObj);
 
            if( pos != std::basic_string<CharT>::npos )
                str.replace(pos, strObj.size(), strDest);
            else
                break;
        }
         
    }

  

template<typename T, typename CharT>
    inline std::vector<T>& Split(std::vector<T> &seq, const std::basic_string<CharT> &str, CharT separator)
    {
        if( str.empty() )
            return seq;
 
        std::basic_stringstream<CharT> iss(str);
        for(std::basic_string<CharT> s; std::getline(iss, s, separator); )
        {
            typename T val;
            std::basic_stringstream<CharT> isss(s);
 
            isss >> val;
            seq.push_back(val);
        }
 
        return seq;   
    }
 
    template < typename CharT >
    inline std::basic_string<CharT> Split(const std::basic_string<CharT> &str, CharT separator, size_t index)
    {
        if( str.empty() )
            return std::basic_string<CharT>();
 
        std::basic_stringstream<CharT> iss(str);
        std::vector<std::basic_string<CharT>> tmp;
 
        for(std::basic_string<CharT> s; std::getline(iss, s, separator); )
        {
            std::basic_string<CharT> val;
            std::basic_stringstream<CharT> isss(s);
 
            isss >> val;
            tmp.push_back(val);
        }
 
        if (index >= tmp.size())
        {
            assert(index < tmp.size());
            return std::basic_string<CharT>();
        }
         
        return tmp[index];
    }