C++ 如何创建一个动态向量数组?

C++ How to create a dynamic array of vectors?

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

我这样声明和初始化它:

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

希望它的形式与此相同:

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

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

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

谢谢大家! :)

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

您是否有兴趣为每个线程创建一个向量,或者一个包含每个线程使用的项目的向量?我假设后者,但我的答案可以调整。

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

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));
}

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

我认为你有点误导,你正在阅读的这个 size 属于第一个元素中的 vector大批。它的大小等于 0,因为尚未在 vector 中插入任何元素。

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]