我想我还没有理解C ++容器和数组的局限性。根据{{3}}和this post,无法在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风格数组。那么,上述帖子和我正在做的事情之间有什么区别,你能举例说明动态项目大小&#34;真的意思是,因为显然我不理解。
答案 0 :(得分:1)
std::string
使用动态内存来增加存储的字符串的大小。这不是那些文章所谈论的内容。
他们的意思是,sizeof(std::string)
是不变的。表示std::string
的实际对象将始终具有相同的大小,但它可能会在内存的另一部分中执行其他分配。
std::vector
实际上只是围绕动态大小的数组的友好包装器。 C或C ++中数组的定义是一个连续的内存块,其中所有元素的大小相等。
答案 1 :(得分:1)
你能举例说明“动态项目大小”的真正含义,因为显然我不理解。
这是你问题的核心。
即:如果所有C ++类(甚至那些管理动态内存作为其实现的一部分)通过sizeof()
具有固定且已知的占用空间大小......那么你是什么类型的东西不能放入std :: vector?
由于类似std::string
和std::bitset
的类是不同大小的类,因此您无法使用 [字符串字符串位集字符串位集字符串] 的向量。但类型系统已经不允许你这样做了。所以这不是他们所说的。
他们只是说没有从C世界支持这样的结构的钩子:
struct packetheader {
int id;
int filename_len;
};
struct packet {
struct packetheader h;
char filename[1];
};
您无法生成std::vector<packet>
并希望找到push_back
的某个参数,以便您指定每个项目的大小。您将丢失在结构边界之外分配的任何数据。
所以要使用类似的东西,你必须做std::vector<packet*>
并存储指针。
答案 2 :(得分:0)
std::string
的大小不是动态的。 std::string
可能是用指向动态分配的内存的指针实现的。这使sizeof(std::string)
静态,可能与实际字符串的大小不同。