【问题标题】:initializing arrays of vectors on the heap, c++在堆上初始化向量数组,C++
【发布时间】:2015-01-05 01:02:20
【问题描述】:

我的目标是在堆上创建一个向量数组(每个向量的容量为 10 个整数)。我可以很容易地创建我的数组:

vector<int>* test = new vector<int>[NUM_VERTS];

但是,这会创建一个空向量数组。我知道每个向量将存储至少 10 个整数,因此我想创建大小为 10 的向量,以避免它们多次重新调整大小(我正在读取一个大文件,因此效率很重要)。我怎样才能修改上面的语句,让它做我想要的?

附带说明,我正在使用 VS 2013 并在调试器上苦苦挣扎。当我运行调试器并查看上面test 的内容时,它向我显示了它指向的区域的内存地址,而不是存储在该地址处的内容。有谁知道我如何查看内容而不是地址?

谢谢

PS 我在堆而不是堆栈上创建向量数组,因为该数组非常大(不到一百万个条目)。当我尝试在堆栈上创建它时,出现堆栈溢出错误。

【问题讨论】:

  • 动态分配vector 是非常少见的,而且为它们的数组这样做几乎是闻所未闻的。如果在编译时知道NUM_VERTS,则使用vector&lt;vector&lt;int&gt;&gt; test;array&lt;vector&lt;int&gt;, NUM_VERTS&gt; test;
  • @Praetorian 我使用向量数组的原因是因为我认为它比使用向量向量更快。正如我所提到的,我正在读取的文件非常大,所以我希望尽可能高效。
  • 当你使用new []操作符分配内存时,唯一可以用来初始化对象的构造函数是默认构造函数。
  • 向量数组或向量向量之间不应该有任何明显的性能差异,因为在这两种情况下,外部容器都有连续的存储空间。
  • @Praetorian 除了非常规地避免制作向量数组之外,还有什么理由吗?

标签: c++ arrays vector initialization


【解决方案1】:

您可以创建一个 vectors 中的 vector,它与数组不同,但对于您的用例,它应该是等效的:

std::vector< std::vector<int> > test(NUM_VERTS, std::vector<int>(10));

不需要用 new 分配它,因为 vector 元素已经在堆上。

如果你需要指向第一个包含向量的指针,你可以使用

std::vector<int> *p = &test[0];

并使用p,就好像它是一个堆分配的向量数组(vector 的所有元素都保证在内存中是连续的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-08
    • 2011-06-02
    • 2022-12-31
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多