C++数组和向量动态项大小
C++ array and vector dynamic item size
我想我仍然不理解C++容器和数组的局限性。根据这篇文章和这篇文章,不可能将动态大小的项目存储在STL向量中。
然而,使用下面的代码,我可以动态地重新调整向量元素的大小,如果在向量中有大小变化的项是可以的,则会得到预期的结果。
string test = "TEST";
vector<string> studentsV;
for (int i = 0; i < 5; ++i)
{
studentsV.push_back(test);
}
studentsV[2].resize(100);
for (string s : studentsV)
{
cout << s << "end" << endl;
}
结果:
TESTend
TESTend
TEST
end
TESTend
TESTend
我可以将字符串元素的大小重新调整为任何大小,而且效果很好。我也可以对正则C样式数组执行同样的操作。那么,上面的帖子和我正在做的事情有什么区别,你能举一个"动态项目大小"的真正含义的例子吗?因为显然我不理解。
std::string
使用动态内存来增加所存储字符串的大小。这不是那些文章所说的。
它们的意思是sizeof(std::string)
是常数。表示std::string
的实际对象将始终具有相同的大小,但它可能会在内存的另一部分进行额外的分配。
std::vector
实际上只是一个围绕动态大小数组的友好包装器。在C或C++中,数组的定义是所有元素大小相等的连续内存块。
你能举一个"动态项目大小"真正含义的例子吗?因为显然我不理解。
这是您问题的核心。
也就是说:如果所有C++类(即使是那些在实现中管理动态内存的类)都通过sizeof()
具有固定且已知的占用空间大小。。。什么样的东西是不能放在std::vector中的?
由于像std::string
和std::bitset
这样的类是不同大小的类,所以不能有[string string bitset string bitset string]的向量。但是类型系统已经不允许你这么做了。所以这不可能是他们所说的。
他们只是说,像这样的C世界支撑结构是没有钩子的:
struct packetheader {
int id;
int filename_len;
};
struct packet {
struct packetheader h;
char filename[1];
};
您无法生成std::vector<packet>
,并且希望找到push_back
的一些参数,以便指定每个项目的大小。您将丢失在结构边界之外分配的任何数据。
因此,要使用类似的东西,您必须执行std::vector<packet*>
并存储指针。
std::string
的大小不是动态的。CCD_ 12可能通过指向动态分配的存储器的指针来实现。这使得sizeof(std::string)
是静态的,并且可能与实际字符串的大小不同。
- std::向量与传递值的动态数组
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- C++字符串数组的动态向量
- 是否可以使用宏来访问动态数组或向量中的元素或为其赋值
- 动态分配特征向量的模因
- 在存储库中,筛选器函数返回动态向量或其他存储库
- 超载添加操作员和动态向量的分割故障
- 聚集,模板和动态向量
- C++中的特征库有一个动态向量或矩阵吗
- 使用特征库填充动态向量
- C++对的动态向量
- 一维数组是否比特征动态向量快
- 如何在C++中将文本文件读入两个动态向量
- 了解我有多少内存可用于一个动态向量c++
- 指向对象的指针的向量的动态向量,C++
- 动态向量的期望内容
- 初始化动态向量列表
- 真正的动态向量类型
- 在遍历动态向量时使用auto的异常行为
- 动态向量的特征库内存使用情况