gpt4 book ai didi

c++ - 在填充成员 vector 期间避免复制构造函数

转载 作者:太空狗 更新时间:2023-10-29 20:21:02 30 4
gpt4 key购买 nike

我有一个类A:

class A {
int value1;
int value2;
std::string text;

public:
A(int value1, int value2, std::string text)
: value1(value1), value2(value2), text(text) { }
};

还有一些“容器”类B:

class B {
std::vector<A> objects;
...

public:
...
void addObject(A a) {
objects.push_back(a);
}
};

和代码:

B b;
A a(2, 5, "test");
b.addObject(a);
//I no longer need a from now on

我的问题是,如何优化 B::addObject(A a) 以避免任何复制。我想要实现的是通过 B 的方法将 A 类型的新对象添加到 B.objects

最佳答案

这个问题有很多答案。您可以将 B 函数更改为 move(),并将 move() 更改为该函数:

void addObject(A a) { objects.push_back(std::move(a)); }

b.addObject(std::move(a)); // two moves

您可以添加 addObject 的重载,这些重载由 const 左值引用和右值引用获取

void addObject(A const& a) { objects.push_back(a); }
void addObject(A&& a) { objects.push_back(std::move(a)); }

b.addObject(std::move(a)); // one move

您可以为 addObject 添加一个函数模板来放置:

template <class... Args>
void addObject(Args&&... args) { objects.emplace_back(std::forward<Args>(args)...); }

b.addObject(2, 5, "test"); // zero moves

无论哪种方式,这里都有一个完全不必要的拷贝:

A(int value1, int value2, std::string text) 
: value1(value1), value2(value2), text(text) { }

你想要:

A(int value1, int value2, std::string text) 
: value1(value1), value2(value2), text(std::move(text)) { }

关于c++ - 在填充成员 vector 期间避免复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46452310/

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