将数组的新实例添加到向量

Adding a new instance of an array to a vector

这是我之前问题的延续:

我得到了循环并且一切正常,但我正在尝试将数组的新实例添加到总向量中。

这是我的意思的一个例子:

array<float, 3> monster1 = { 10.5, 8.5, 1.0 };
// ...
vector<array<float, 3>*> pinkys = { &monster1};
// ...
void duplicateGhosts() {

    int count = 0; 
    int i = pinkys.size(); // this line and previous avoid overflow

    array<float, 3>& temp = monster1; // this gets the same data, but right now it's just a reference

    for (auto monster : pinkys) { // for each array of floats in the pinkys vector,
        if (count >= i)           // if in this instance of duplicateGhosts they've all been pushed back,
            break;                
        pinkys.push_back(&temp);  // this is where I want to push_back a new instance of an array
        count++;
    }
}

使用当前代码,不是创建新的 monster,而是添加对原始 monster1 的引用,从而影响其行为。

如评论中所述,您不能将元素插入到您正在使用基于范围的 for 循环迭代的容器中。这是因为基于范围的 for 循环在到达 pinkys.end() 时停止,但是一旦您调用 pinkys.push_back(),该迭代器就会失效。目前尚不清楚您为什么首先要迭代 pinkys 。您没有在循环体中使用 monster(向量中元素的副本)。

循环的全部目的似乎是迭代次数与容器中已有的元素一样多。为此,您不需要迭代 pinkys 的元素,但您可以这样做:

 auto old_size = pinkys.size();
 for (size_t i=0; i < old_size; ++i) {
      // add elements
 }

此外,不清楚您为什么要使用指针向量。必须有人拥有向量中的怪物。如果不是其他任何人,它就是向量。在这种情况下,您应该使用 std::vector<monster>。对于共享所有权,您应该使用 std::shared_ptr。永远不要使用拥有原始指针!

不要将普通数组用于可以提供更好名称的内容:

 struct monster {
      float hitpoints;  // or whatever it actually is.
      float attack;     // notice how this is much clearer
      float defense;    // than using an array?
 };

经过这些修改,该方法可能如下所示:

void duplicateGhosts() {
     auto old_size = pinkys.size();
     for (size_t i=0; i < old_size; ++i) {
         pinkys.push_back( pinkys[i] );
     }       
}

根据方法的名称,我假设您想复制向量元素。如果您只想添加与之前元素相同的 monster 次,即

void duplicateGhosts() {
     auto old_size = pinkys.size();
     for (size_t i=0; i < old_size; ++i) {
         pinkys.push_back( monster{} );
     }       
}