更改向量<string>中字符串的大小
Changing the size of a string in a vector<string>
当向量的一个或多个元素改变大小时,向量会发生什么?
详细说明,
#include <string>
#include <vector>
using namespace std;
int main() {
vector<string> v;
v.push_back("first string");
v.push_back("2nd string");
v[0] += " has increased in size";
}
在"v[0]+=…"时会发生什么?是否会进行大规模重新分配,以保持字符串和向量中的内存连续?
vector
中不会有内存重新分配,几乎可以肯定会有string
的重新分配,尽管标准对此没有任何说明。字符串就像一个向量,它将内容与字符串对象本身分开。
否。CCD_ 3将其实际字符串数据存储在单独分配的存储器中(模短字符串优化)。对象的实际大小永远不会改变,并且在编译时是固定的。任何这样的动态大小调整都是使用单独分配的内存或对象层次结构来完成的(例如,集合/映射使用节点树,列表使用节点的双链接列表等)。
是否会进行大规模重新分配,以保持字符串和向量中的内存连续?
向量的元素是连续的,但在每个包含的字符串中,都有一个指向存储文本内容的动态分配存储的指针(假设字符串不是空的,也不短到足以放入固定大小的内部缓冲区——这是一种被称为"短字符串优化"的技术,实现可能但不需要使用)。
现在,对于向量和字符串,了解当前大小(数据的元素数/char
)和容量(已经保留的堆的数量,容器可以扩展到其中,而无需分配新的堆区域并在其中移动元素)之间的差异非常重要。
因此,如果现有的容量足够,那么字符串串联就会发生。如果必须增加容量,则更新该字符串指向动态内存的指针,以寻址新分配的更大的堆区域,文本内容将复制到该堆区域,然后释放原始堆区域。
push_back()
操作可以导致向量重新分配,但字符串对象"拥有"单独的堆内存块。
如果您想了解具体的实现在做什么,可以在操作前后打印出容器的size()
和capacity()
,以及第一个元素的地址。。。。尽管如此,标准并没有规定重新分配后容量超过大小的数量,因此甚至可能会随着编译器标志/版本、操作系统等而改变
如图所示:
VECTOR: /-------->[first string's text]...extra capacity...
[ first string object /]
[ second string object ]
...extra vector capacity... -->[second string's text]...extra capacity...
string
对象是固定大小的。如果包含的字符串不适合字符串实现提供的内部存储(如果有的话),则会单独分配。它与任何其他字符串存储都不连续,至少不是有意的。
- 迭代和比较映射<字符串、矢量<string>> c++ 中的值
- 将向量解析<string>为字符串
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 两个数组,int 和 string,如何显示带有对应 int 的字符串?
- 将图形表示为unordered_map<字符串、向量>时拓扑排序错误<string>
- 将 std::string( "x3BxDEx7C" ) 转换为可读的十六进制字符串?
- 为什么 string::begin() 在即时窗口中输出整个字符串
- 比较 std::string 和 C 样式字符串文字
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 将 c 字符串直接写入 std::string
- std::hash<std::string> 可以为不同的字符串返回相同的值吗?
- 反转没有循环的字符串,C++中只有 std::string 成员
- 为什么我不必从 std::string 的函数中释放字符串c_str?
- 包括<字符串>,使用不完整的类型"std::string"
- 如何找到串联ASCII和std::string的子字符串
- 如何在c++中打印原始std::string/c样式的字符串
- 从映射<字符串、矢量中对唯一值进行排序<string>>
- C++ 在列表变量名称中查找字符串字符串<string>