C++数组和向量动态项大小

C++ array and vector dynamic item size

本文关键字:动态 向量 数组 C++      更新时间:2023-10-16

我想我仍然不理解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::stringstd::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)是静态的,并且可能与实际字符串的大小不同。