我有以下代码段。我希望用vector
对象的不同实例来填充Object
。也就是说,每次向向量添加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;
}
答案 0 :(得分:2)
那是因为您正在调用参数化构造函数一次以创建原型对象。之后,正在调用复制构造函数。 As in the documentation:
如果当前大小小于count,则附加其他元素并使用值副本进行初始化。
如果你想添加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中有一些例程可以使用重复调用的函数的结果覆盖一系列项目。但我不认为这就是你想要的;因为它要求集合中已经有覆盖的对象。这是我的印象。因此,当需要唯一地生成每个对象时,在最后添加新项目时,我认为emplace_back
是可行的方法。
作为补充说明,请始终记住减少您的示例。如果不是内存分配,请不要包含新内存。如果两个字段足够,请不要使用四个。如果可能,请始终以"Minimal, Complete, Verifiable Example"的形式提交您的问题(如上面的代码所示)。