我在初始化std :: vectors数组时遇到了问题。
我正在宣布并初始化它:
vector<component_change*>* _changes;
_changes = new vector<component_change*> [numThreads];
希望它的形式与此相同:
int * foo;
foo = new int [5];
但是当我在初始化后遇到断点时,_changes'的大小为0。 我做错了什么,我该如何解决?
我不想使用向量向量,因为我需要的数字在整个程序中保持不变,但取决于当前的硬件。而且我不只是在寻找单个向量(每个向量将由不同的线程使用,然后在线程完成任务时合并)。
谢谢你们! :)
答案 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]