【问题标题】:Vector C++ Memory Allocation矢量 C++ 内存分配
【发布时间】:2013-05-26 02:39:03
【问题描述】:

我想创建一个代表某种结构的元素向量。

问题是我不知道这个结构会有多少元素,因为数字会经常变化,而且我真的不知道如何创建一个向量。

如何做到这一点?

为了更清楚:

我看到在创建向量时,你会这样做:

std::vector<structureType> vectorName(nrOfElements);

我不知道元素的数量以及在括号之间写什么。

【问题讨论】:

标签: c++ memory memory-management vector


【解决方案1】:

我不知道在括号之间写什么

什么都不写 )) 在这种情况下,您将创建一个空向量,它可以使用 std::vector::push_back() 增长

更新:不要忘记删除空()以避免vexing parse

【讨论】:

  • If you write nothing between the brackets, you hit the most vexing parse。完全省略括号(如果您使用的是c++11,则使用大括号{}统一初始化语法)。
  • 其实你会声明一个这样的函数。所以你也需要省略(),或者如果你有C++11,则使用{}
  • @BoBTFish 是的,我知道令人烦恼的解析。是的,我忘了说省略()。谢谢你的评论。我会更新的。
【解决方案2】:

如果你默认构造向量,你会得到一个空的:

std::vector<structureType> vectorName; // holds 0 elements

然后你可以将元素推入向量,增加它的大小(另见其他vector modifiers):

vectorName.push_back(someStructureTypeInstance);

这可能适合您的需求。如果担心未来内存重新分配,可以在构造向量后使用std::vector::reserve

std::vector<structureType> vectorName; // holds 0 elements
vectorName.reserve(100); // still 0 elements, but capacity for 100

【讨论】:

  • 如果我按照您的建议进行操作,即保留空间,例如,如果我为 101 个元素保留空间,然后添加第 102 个元素,会发生什么情况?另外,在我的程序中,我动态分配了一些内存。如果我选择这样声明向量: std::vector vectorName; ,然后只是向其中添加元素,这是否有可能与手动分配的内存重叠?
  • @user2399378 插入第 102 个元素时发生的情况是,向​​量必须分配一块足够容纳 102 个元素的新内存块(通常它分配的大小约为所需大小的 2 倍),然后将其所有元素从原始的 101 大小的内存块复制或移动到新的内存块,然后取消分配原始内存。这些是我所说的重新分配。您不必担心内存管理,但重新分配的成本可能很高,因此如果您知道向量将有多大,您可以通过保留适当的数量来避免它们。
【解决方案3】:

您可以通过插入和/或删除元素来更改向量包含的元素数量。您正在专门寻找向量的方法insertpush_back/emplace_backresizepop_backerase

您可以在任何 C++ 参考资料(例如,查看“修饰符”部分中的 here)和您选择的 C++ 初学者书籍中找到对这些方法的描述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2015-04-05
    相关资源
    最近更新 更多