将字符串视为字符向量似乎是显而易见的。那么为什么字符串有自己的特殊实现,这看起来与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; }
这是来自vector:
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
答案 0 :(得分:3)
以此片段为例:
string s = "abc";
没有容器具有类似的初始化语法,它接收指向第一个元素的指针并扫描序列中的特殊终止符元素。使用std::vector
至少会很麻烦。由于文本在计算中很常见,因此只需要一个方便的文本容器类型,std::vector
就不合适了。
尽管如此,我可以想象std::string
私下继承std::vector<char>
或将其汇总,但这与其专业化完全不同。它也不是一个专业化,因为如果你想要一个不像字符串的vector<char>
怎么办?然后,您今天将获得与vector<bool>
相同的fubar。
答案 1 :(得分:2)
std::string
的行为与std::vector
不兼容,特别是最后出现零值。
C ++11§21.4.5/ 2关于operator[]
,在[string.access]中:
“如果
*(begin() + pos)
则返回pos < size()
,否则返回值为T
的对象的引用charT()
;参考值不得修改。
另一个重要区别是std::string
支持小缓冲区优化,而优化可能性为not available for std::vector
。