vector中元素在内存中是连续存储的吗?如果是string类型的元素呢?

2024-12-02 02:27:42
推荐回答(4个)
回答1:

vector中的元素在内存中确实是连续存储的. vector的实现是由一个动态数组构成. 当空间不够的时候, 采用类似于C语言的realloc函数重新分配空间. 正是因为vector中的型返元素是连续存储的, 所以vector支持常数时间内完成元素的随机访问. vector中的iterator属于Random Access Iterator.

如果vector储存的是string类型. 情况也是一样的. 值得注意的是, string类型并不是简单的char 数组. string中的数组其实也是动态分配的. 为了方便, 你可以这样理解(不完全正确), 当vector中存储string类型时, 其实是数组中存着许多char *类型的指针, 每个指针指向的内容才是string的字符内容. 可以给你一仿猛个简单的图示
+----+----+----+----+----+----+
vector | * | * | * | * | | |
+-- |-+--|---- |---- |-------------+
| | | |
v v v v
s1 s2 s3 s4
至于你说的强制类型转换做内存拷贝, 我不太明备租桥白你想表达的意思, 所以这点我不知如何说起.

回答2:

这不合适··朋友。强制拷贝一个容器是没有意义的,你仍然拿不到连续游慧的数据。而且,你觉得神指答string空间是连续的吗?string的内容也是动态分配的啊,不仅仅是无意义,这么做是错的逗芹。

回答3:

不是,数据多了,会分好几块内存。
且string是类,不能做内存拷贝。

回答4:

可以的,完全没有问题。你的程序主要的问题是:
1.如果模版内部还有模版,则两个>>和<<一定要分塌颂开,否则会当成是移位运算符而出错。这是一个很容易犯的冲举错误。
所有类似vector> n,d;的语句统一改为vector< vector > n,d;
2.你在类外散衫碧定义send函数的时候没有加作用域标识符。
3.m.clear();你把m清空了,一个空模版是不能输入的。
如果vector储存的是string类型. 情况也是一样的. 值得注意的是, string类型并不是简单的char 数组. string中的数组其实也是动态分配的。
我的答案可供您参考,谢谢。