【问题标题】:C++ How to create a dynamic array of vectors?C ++如何创建动态向量数组?
【发布时间】:2015-03-27 16:50:57
【问题描述】:

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

我这样声明和初始化它:

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

希望它的形式与此相同:

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

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

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

谢谢各位! :)

【问题讨论】:

  • “在整个程序中保持不变,但取决于当前的硬件”std::array&lt;&gt; 怎么样?
  • @awesomeyi 谢谢,我会看看 :)
  • @awesomeyi 抱歉,我认为这不是我真正想要的。我使用 thread::hardware_concurrency() 来获取内核数,然后创建一个该大小的新数组,我认为我不能将其传递给 std::array。或者我可以吗?
  • @NeilKirk:除非每个线程有几个组件,在这种情况下它是std::vector&lt;std::vector&lt;component_change&gt;&gt;

标签: c++ arrays dynamic vector std


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我在看这个自动取款机。
    • 谢谢,这行得通。我担心矢量的性能,但如果我不改变它,它应该不会有什么不同。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        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]
        

        【讨论】:

        • 是的,你写的最后一点是我需要的。谢谢
        猜你喜欢
        • 2015-05-18
        • 2020-05-05
        • 2021-06-26
        • 1970-01-01
        • 2012-08-02
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        相关资源
        最近更新 更多