gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:00:05 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com