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

标签 c++ random vector constructor

我有以下代码片段。我希望它用我的 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/

相关文章:

c++ - 比较两个具有相同值的 TCHAR 结果为 false

if-statement - VBScript - 如何生成随机数,然后使用 If 语句使用该数字来选择选项

java - 如何让java的随机生成器在构造函数语句中生成 double for变量?

c++ - 链接硬编码函数指针

c++ - QRegExp 未按预期运行

android - 将开源的JniLibs整合到自己的android项目中

matlab - 如何生成n个点并限制它们之间的距离大于给定值?

c++ - 在类的构造函数中初始化一个二维 vector

c++ - 为什么 vector 分配会改变分配的 vector

c++ - 在 2dim vector 中插入一个值?