BoB*_*ish 11
std::string它与std::vector(和其他标准容器)的接口有一个非平凡的部分,但它绝对是一个不同的东西,具有不同的目的.
它也可以以非常不同的方式实现,因为它允许诸如小字符串优化或写入时复制(自2011年以来不合法)之类的事情.(虽然他们当然可能有非常相似的实现).
它们都支持随机访问迭代器,因此可以使用与标准算法类似的方式.我认为 std::string不能归类为序列容器.
std::string通过继承来直接实现许多成员函数是不可能的std::vector,因为它隐藏了它也存储NUL-terminator 的事实.因此,当std::string::size返回时3,std::vector::size将返回4,例如.同样适用于end其他一些人.
从一个纯粹的哲学点:是,一个串是一个类型的载体.它是一个存储字符的连续内存块(向量是一个存储任意类型对象的连续内存块).因此,从这个角度来看,字符串是一种特殊的向量.
在设计和实施方面std::string与std::vector他们分享一些相同的界面元素(如连续的内存块operator[]),但std::string也不会从派生std::vector(旁注:你不应该公开的,因为它们不是设计为基于标准集装箱派生类 - 例如,它们没有虚拟析构函数),也不能直接相互转换.也就是说,以下内容将无法编译:
std::string s = "abc";
std::vector<char> v = s; // ERROR!
Run Code Online (Sandbox Code Playgroud)
但是,由于它们都具有迭代器支持,因此您可以将字符串转换为向量:
std::string s = "abc";
std::vector<char> v(s.begin(), s.end()); // note that the vector will NOT include the '\0' character
Run Code Online (Sandbox Code Playgroud)
std::string 将不再具有引用计数(从C++ 11开始),因为C++ 11标准禁止许多实现使用的写时复制功能.
从存储的角度来看,一个实例std::string看起来非常相似的std::vector<char>(例如,它们都将有一个指向其存储位置,大小,容量),但两个类的功能是不同的.
| 归档时间: |
|
| 查看次数: |
1434 次 |
| 最近记录: |