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

时间:2014-01-12 20:56:13

标签: c++ arrays vector stl

我想我还没有理解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;真的意思是,因为显然我不理解。

3 个答案:

答案 0 :(得分:1)

std::string使用动态内存来增加存储的字符串的大小。这不是那些文章所谈论的内容。

他们的意思是,sizeof(std::string)是不变的。表示std::string的实际对象将始终具有相同的大小,但它可能会在内存的另一部分中执行其他分配。

std::vector实际上只是围绕动态大小的数组的友好包装器。 C或C ++中数组的定义是一个连续的内存块,其中所有元素的大小相等。

答案 1 :(得分:1)

  

你能举例说明“动态项目大小”的真正含义,因为显然我不理解。

这是你问题的核心。

即:如果所有C ++类(甚至那些管理动态内存作为其实现的一部分)通过sizeof()具有固定且已知的占用空间大小......那么你是什么类型的东西不能放入std :: vector?

由于类似std::stringstd::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)静态,可能与实际字符串的大小不同。