假如vector中存放100个string(不是指针类型string*,而是string),那么如果vector中的一个string重新分配空间,会不会造成整个vector重新分配空间呢?假如代码如下:
vector<string> *v1 = new vector<string>(100);
v1[20].append("abc");
假设最后一句使v1[20]字符串超出原分配空间,根据string类型的算法,这个字符串会重新分配空间并复制数据,因为它属于v1的,而v1中的元素必须是连续的,所以是不是它也将会造成整个v1重新分配空间并复制数据呢?
基础知识不扎实啊!
数组元素的大小(sizeof(std::string))是固定的,不能更改,这是数组的基本属性。你把元素自身管理的内存同容器管理的内存搞混淆了。
std::string& str = v1[20];
str.append("abc"); // 你想想,有什么机制能让 str 将重新分配字符串空间的操作通知或委托给 std::vector<std::string>> 来执行?办不到,所以,这里的内存分配是 std::string 自身的行为,跟 std::vector 无关。
按照你的举例,我也举一个:
std::vecotr<std::vector<int>> v1(100);
v1[20].resize(200);
你不觉得很奇怪吗?如果vector<string>中的元素是string,那么当某个元素超出它预先分配空间,它是要重新分配大小为原来2倍的空间的,而且我们知道vector内部元素的存放也是连续的,那这个新的字符串放哪里去?但是实验的结果竟然是string地址不变,哪说明vector是存放string*吗?但我们声明是vector<string>而不是vector<string*>啊?难道vector<string>中的元素是存放string*(字符串指针)而不是string吗?那说明vector这个模板竟然还会根据模板参数的类型进行不同编译啊?
@Patrickz10: 不奇怪,奇怪是因为你基础差啊!你看下 string 的源码,看下拷贝构造函数的实现。你是不是从 C# 转过来的?
@Patrickz10:
std::string str1;
std::string str2="abcdfdfdddddddddddddddddddddddddddddddddddsfsdfdsf";
sizeof(str1) 等于 sizeof(str2) 不?
@Launcher: 对,看来string类中对字符串数据存放的是字符数组的指针了,这样就能解释过去,我本来以为是直接存放字符数组,才有上面那个疑问。vecotr<int>中也应该是存放int数组的指针,而不是直接声明数组本身,这样它们的数据成员空间再分配时就不会影响原来对象的地址。粗读了STL源码,应该是这样,对吧?要仔细研究暂时没有时间,那些是内部实现机制,可能只对高手来说才是基础吧?呵呵
@Launcher: 我没有分送了,送完了,只能说谢谢你