参见英文答案 >
Why are string and vector distinct types?4个
将字符串视为字符向量似乎是显而易见的.那么为什么字符串有自己的特殊实现,这看起来与vector类有很大的不同?
将字符串视为字符向量似乎是显而易见的.那么为什么字符串有自己的特殊实现,这看起来与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); 390 391 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()); 398 399 if (capacity() < n) 400 { 401 __value_alloc_type va(__end_of_storage); 402 iterator tmp = va.allocate(n,__start); 403#ifndef _RWSTD_NO_EXCEPTIONS 404 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
.