我有以下代码片段。我希望它用我的 Object
对象的不同实例填充一个 vector
。也就是说,每次它向 vector 添加一个 Object
时,它都应该调用 rand()
并用另一个 Object 唯一的一组值填充该对象
对象。相反,这会使用相同的值填充所有对象。
std::vector<Object> *objects;
Image::Image(unsigned nObjects)
{
srand(2);
objects = new std::vector<Object>();
this->nObjects = nObjects;
objects->resize(nObjects, Object(rand(), rand(), rand(), rand()));
for(int i = 0; i < objects->size(); ++i)
std::cout << objects->at(i).getX1() << std::endl;
}
最佳答案
那是因为您调用了一次参数化构造函数来创建原型(prototype)对象。之后复制构造函数被调用。 As in the documentation :
If the current size is less than count, additional elements are appended and initialized with copies of value.
如果你想添加 N 个新项目然后 AFAIK 你需要使用 push_back
(或者最好是 C++11 中的 emplace_back
)在一个循环中:
#include <iostream>
#include <vector>
using namespace std;
struct Object {
int alpha;
int beta;
Object (int alpha, int beta) : alpha (alpha), beta (beta) {}
};
int main() {
vector<Object> objs;
int nObjects = 5;
for (int i = 0; i < nObjects; i++) {
objs.emplace_back(rand(), rand());
}
for (Object & o : objs) {
cout << o.alpha << "," << o.beta << "\n";
}
}
<algorithm>
里面有一些套路喜欢generate_n使用重复调用的函数的结果覆盖一系列项目。但我认为这不是你想要的;因为它要求集合中已经包含您覆盖的对象。这是我的印象。所以当每个对象都需要唯一生成的时候在末尾添加新的item,我觉得emplace_back
是要走的路。
作为附加说明,请始终记住减少您的示例。如果它与内存分配无关,请不要包含新的。如果两个字段就足够了,就不要使用四个。如果可能,请始终以 "Minimal, Complete, Verifiable Example" 的形式提交您的问题(如上面的代码)。
关于c++ - 在 C++ 的 vector resize() 函数中随机化构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26520679/