将字符串视为字符向量似乎是显而易见的.那么为什么字符串有自己的特殊实现,这看起来与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)
ifpos < size()
,otherwise a reference to an object of typeT
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的特化?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)