在c ++的vector resize()函数中随机化构造函数参数

时间:2014-10-23 03:11:23

标签: c++ random vector constructor

我有以下代码段。我希望用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;
}

1 个答案:

答案 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"的形式提交您的问题(如上面的代码所示)。