C ++如何创建动态矢量数组?

时间:2015-03-27 16:50:57

标签: c++ arrays dynamic vector std

我在初始化std :: vectors数组时遇到了问题。

我正在宣布并初始化它:

vector<component_change*>* _changes;
_changes = new vector<component_change*> [numThreads];

希望它的形式与此相同:

int * foo;
foo = new int [5];

但是当我在初始化后遇到断点时,_changes'的大小为0。 我做错了什么,我该如何解决?

我不想使用向量向量,因为我需要的数字在整个程序中保持不变,但取决于当前的硬件。而且我不只是在寻找单个向量(每个向量将由不同的线程使用,然后在线程完成任务时合并)。

谢谢你们! :)

5 个答案:

答案 0 :(得分:1)

您的计划是正确的。但是你误解了调试器。 _changes的大小不是0,但是数组中的第一个向量(一个_changes指向)是空的。那是因为调试器不知道_changes指向单个元素还是数组(在这种情况下编译器不知道该数组中有多少元素)。只需使用矢量并拨打std::vector::shrink_to_fit

答案 1 :(得分:0)

如果可以在编译时确定大小,请使用std::array。如果大小是运行时参数,则使用向量,不要更改容器的大小。

答案 2 :(得分:0)

您是否对每个线程都有一个向量,或者包含每个线程使用的项目的向量感兴趣?我假设后者,但我的答案可以改编。

这是使用静态大小的数组; (这个语法很接近)。

const int NUMBER_OF_THREADS = 5;
component_change* _changes[NUMBER_OF_THREADS] =
{
  new component_change(1),
  new component_change(2),
  new component_change(3),
  new component_change(4),
  new component_change(5)
}

如果线程数是动态的,则必须使用新的...

int NUMBER_OF_THREADS = system.getThreadCount();
component_change* _changes = new component_change[NUMBER_OF_THREADS];

for (int i = 0; i < NUMBER_OF_THREADS; i++)
{
  _changes[i] = new component_change(i+1);
}

如果你想要一个std :: vector:

 int NUMBER_OF_THREADS = system.getThreadCount();
std::vector<component_change*> _changes;
_changes.reserve(NUMBER_OF_THREADS);

for (int i = 0; i < NUMBER_OF_THREADS; i++)
{
  _changes.push_back(new component_change(i+1));
}

答案 3 :(得分:0)

我认为你有点误导,你正在阅读的大小属于数组第一个元素中的 vector 。它的大小等于0,因为尚未在向量中插入元素。

答案 4 :(得分:0)

new vector通常是错误的。

如果可能的话,你应该使用最优先的

std::vector<component_change> _changes(numThreads);

std::vector<std::unique_ptr<component_change>> _changes(numThreads);

std::vector<component_change*> _changes(numThreads);

或者如果向量的每个元素本身都包含一个组件数组(在你的问题中不清楚)

std::vector<std::vector<**component_change**>> _changes(numThreads);

根据您的需要,将组件声明为上述方式之一。

请注意,指针开始不指向任何内容。您必须将各个组件分配为单独的步骤。

下面创建一个numThreads向量数组,而不是numThread元素的向量。

new vector<component_change*> [numThreads]