【问题标题】:randomizing constructor parameters in c++'s vector resize() function在 C++ 的向量 resize() 函数中随机化构造函数参数
【发布时间】:2014-10-23 03:11:22
【问题描述】:

我有以下代码sn-p。我希望它用我的Object 对象的不同实例填充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;
}

【问题讨论】:

    标签: c++ random vector constructor


    【解决方案1】:

    这是因为您调用了一次参数化构造函数来创建原型对象。之后,复制构造函数被调用。 As in the documentation:

    如果当前大小小于 count,则附加元素并使用 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";
        }
    }
    

    &lt;algorithm&gt; 中有一些例程,例如generate_n,可以使用重复调用的函数的结果覆盖一系列项目。但我认为这不是你想要的。因为它要求集合中已经包含您覆盖的对象。这就是我的印象。因此,当每个对象需要唯一生成时,将新项目添加到末尾时,我认为emplace_back 是要走的路。

    作为附加说明,请始终记住减少您的示例。如果不是关于内存分配,请不要包含新的。如果两个字段就足够了,请不要使用四个字段。如果可能,请始终以"Minimal, Complete, Verifiable Example" 的形式提交您的问题(如上面的代码)。

    【讨论】:

    • 完美,谢谢。由于遗留原因,我最终使用了回推。 emplace_back 有什么优势?
    • @audiFanatic push_back 发生的事情是您生成一个对象,然后将其传递给方法。该对象已经在内存中的某处生成。但是向量拥有一个对象数组的内存块,现在必须将对象放入其中。所以它被复制构造到向量中的那个槽中。 emplace_back 实际上是“就地”构造对象;因此,唯一发生的对象构造立即将其放置在最终需要去的地方。 C++11 在很多方面都向前迈出了一大步,所以尽快开始使用吧!
    • 啊,我明白了。是的,这不是我的选择。我会使用它,但我正在与使用 Visual Studio 的人合作,我不相信微软已经实现了一切。不过我个人使用 g++。
    • @audiFanatic 可能没有什么理由不使用他们已经实现的部分。如果它编译它应该工作。它只是不会总是编译......所以它是完整规范的一个子集。 Here's a list 用于 VS2010 和 VS2012 以及 - 与此答案相关 - 关于如何存在 a limit to the number of parameters to emplace_back 的注释(您可以手动覆盖)。
    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多