创建包含其他对象并传递给要添加到向量的函数的对象的不同方法之间是不是存在差异

Posted

技术标签:

【中文标题】创建包含其他对象并传递给要添加到向量的函数的对象的不同方法之间是不是存在差异【英文标题】:Is there difference between different ways of creating an object that contains other objects and is passed to a function to be added to a vector创建包含其他对象并传递给要添加到向量的函数的对象的不同方法之间是否存在差异 【发布时间】:2021-09-03 14:52:15 【问题描述】:

如果我们有一个包含其他类对象向量的类

   class BigClass
    
    private:
    vector<ClassName> vec;
    //more code
    public:
    void AddItem(const ClassName& i) vec.push_back(i);
    //more code
    ;

而且这个类还包含其他类的对象(结构,因为它们很简单)。其中包含另一个对象。

class ClassName

private:
StructName obj;
//more code
public:
ClassName(const StructName &s) : obj(s) 
ClassName(double x,
 double y,
 int i,
 const &OtherStruct o1,
 const &OtherStruct o2) 
 : obj(x, y, i, o1, o2) 
;

struct StructName 

 double x;
 double y;
 int i;
 OtherStruct o1;
 OtherStruct o2;
;

struct OtherStruct

  int x;
  int y;
  int z;
;

调用 AddItem 的不同选项之间是否有任何区别/优点/缺点?假设我们已经有了变量double x, double y, int i, const &amp;OtherStruct o1, const &amp;OtherStruct o2

AddItem(x, y, i, o1, o2); //1
AddItem(ClassNamex, y, i, o1, o2); //2
AddItem(ClassName(x, y, i, o1, o2)); //3
AddItem(StructNamex, y, i, o1, o2); //4
AddItem(ClassNameStructNamex, y, i, o1, o2); //5
AddItem(ClassName(StructNamex, y, i, o1, o2)); //6

【问题讨论】:

确保代码示例有意义符合您的最大利益。如果您提供胡言乱语的示例,那么您很可能会完全忽略这个问题,而倾向于尝试解决示例中的所有问题。 确实,您以相反的顺序发布课程有点奇怪。 【参考方案1】:

没有。所有这些只是构造ClassName 的不同语法,但它们本质上都是一样的。然后ClassName 被传递给AddItem,它的构造方式完全没有区别。而这个的实现会在向量中分配更多的空间,然后将对象复制到自身中。

但是:

template<class...Us>
void AddItem(Us&&...vs)  vec.emplace_back(std::forward<Us>(vs)...);

这有细微的不同,它将参数按原样传递给向量,这将分配更多空间,然后直接在自身内部构造ClassName,这可能会或可能不会节省您的CPU制作工作您的ClassName 的两份副本。 (重要提示:优化器可能已经在使用您的代码执行此操作,我不知道。)

这种复杂性可能不值得,因为ClassName 看起来很容易复制。

【讨论】:

您的代码似乎不起作用。也许(vec.emplace_back(std::forward&lt;Us&gt;(vs)), ...); @Ranoiaetep 谢谢。固定。

以上是关于创建包含其他对象并传递给要添加到向量的函数的对象的不同方法之间是不是存在差异的主要内容,如果未能解决你的问题,请参考以下文章

将继承的类对象的向量传递给期望基类向量的函数

用向量 c++ 中的指针成员初始化对象

如何将对象添加到类中的静态向量

使用 std::sort 对包含两个数据成员的对象向量进行排序

java 怎样传递数组对象

传递派生模板类的向量