c – 为什么std :: string不是std :: vector的特化?

c – 为什么std :: string不是std :: vector的特化?,第1张

概述参见英文答案 > Why are string and vector distinct types?                                    4个 将字符串视为字符向量似乎是显而易见的.那么为什么字符串有自己的特殊实现,这看起来与vector类有很大的不同? 为了说明这一点,以下是来自两个类的一些片段,以表明所需的工作非常相似,例如:都使用分配器来管理内存.同样具有特 参见英文答案 > Why are string and vector distinct types?4个
将字符串视为字符向量似乎是显而易见的.那么为什么字符串有自己的特殊实现,这看起来与vector类有很大的不同?

为了说明这一点,以下是来自两个类的一些片段,以表明所需的工作非常相似,例如:都使用分配器来管理内存.同样具有特征也可用于载体.

如果我们允许向量具有类型特征,那么从std :: string的实现中剪切下来看起来它将适合std :: vector的更一般的实现.

139  template <class _charT,class _Traits,class _Allocator >                                        | 140  class _RWSTDExportTemplate basic_string                                                           | 141  {                                                                                                 | 142  public:   .... 333    size_type size () const   { return length(); }                                                  | 334    inline size_type length () const;                                                               | 335    size_type max_size () const                                                                     | 336    {                                                                                               | 337      return npos - sizeof(__rep_type)-2;                                                           | 338    }                                                                                               | 339    inline voID resize (size_type,_charT);                                                         | 340    voID resize (size_type n)                                                                       | 341    {                                                                                               | 342      resize(n,__eos());                                                                            | 343    }                                                                                               | 344    inline size_type capacity () const;                                                             | 345    inline voID reserve (size_type=0);                                                              | 346    voID clear () { erase(); }                                                                      | 347    bool empty () const  { return length() == 0; }

这是来自矢量:

75  template <class _Tt,class _Allocator _RWSTD_COMPLEX_DEFAulT(allocator<_Tt>) >                    |76  class vector                                                                                      |77  {                                                                                                 |78       86  public:                                                                                           |87    //                                                                                              |88    // Types.                                                                                       |89    //                                                                                              |90    typedef _Tt                                         value_type;                                 |91    typedef _Allocator                                  allocator_type;                             |92 383    //                                                                                              |384    // Capacity.385    //386    size_type size ()     const { return size_type(end() - begin()); }387    size_type max_size () const { return __value_alloc_type(__end_of_storage).max_size();   }388    voID resize (size_type new_size);389    voID resize (size_type new_size,_Tt value);390391    size_type capacity () const { return size_type(__end_of_storage.data() - begin()); }392    bool      empty ()    const { return begin() == end();                    }393    voID reserve (size_type n)394    {395      _RWSTD_THROW(n > max_size(),length_error,396        __RWSTD::except_msg_string(__RWSTD::__rwse_InvalIDSizeParam,397          "vector::reserve(size_t)",n,max_size()).msgstr());398399      if (capacity() < n)400      {401        __value_alloc_type va(__end_of_storage);402        iterator tmp = va.allocate(n,__start);403#ifndef _RWSTD_NO_EXCEPTIONS404        try {405          uninitialized_copy(begin(),end(),tmp);406        } catch(...) {407          __value_alloc_type(__end_of_storage).deallocate(tmp,n);408          throw;409        }410#else
解决方法 std :: string的行为与std :: vector不兼容,特别是最后出现零值.

关于operator []的C11§21.4.5/ 2,在[string.access]中:

” Returns: *(begin() + pos) if pos < size(),otherwise a reference to an object of type T with value
charT(); the referenced value shall not be modifIEd.

另一个很大的区别是std :: string支持小缓冲区优化,而优化可能性是not available for std::vector.

总结

以上是内存溢出为你收集整理的c – 为什么std :: string不是std :: vector的特化?全部内容,希望文章能够帮你解决c – 为什么std :: string不是std :: vector的特化?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239847.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存