将数组的新实例添加到向量
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{} );
}
}
这是我之前问题的延续:
我得到了循环并且一切正常,但我正在尝试将数组的新实例添加到总向量中。
这是我的意思的一个例子:
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{} );
}
}