如何将其切换到 unique_ptr?
Posted
技术标签:
【中文标题】如何将其切换到 unique_ptr?【英文标题】:How do I switch this to unique_ptr? 【发布时间】:2018-08-25 07:09:46 【问题描述】:如何做到这一点,这样我就不必手动删除指针?
unique_ptr
在 vector<>
中?
这是我的代码:
class vec2
public:
double x;
double y;
vec2()
x = 0.0;
y = 0.0;
vec2(double xx, double yy)
x = xx;
y = yy;
cout << "constructor called" << endl;
~vec2()
static int count = 0;
cout << "destructor " << count << endl;
count++;
virtual double Length() return sqrt(x * x + y * y);
bool operator==(vec2& v) return x == v.x && y == v.y;
virtual string toString()
stringstream s("");
s << "[" << x << " " << y << "]";
return s.str();
;
int main()
vector<vec2*> vecs;
vecs.push_back(new vec2(1.8, 1.7));
vecs.push_back(new vec2(1.99, 1.7));
for (vec2* v : vecs)
cout << v->toString() << endl;
delete v;
http://www.xgdev.com/notepad/textfiles/37631a.txt
【问题讨论】:
不使用指针并将其设为std::vector<vec2>
怎么样?
如果我使用普通的 vec2 会更慢,并且构造函数和析构函数被调用的次数更多,效率更低。
@Thomas,可能virtual
方法的存在是有原因的。
还有一个 vec3 类,但我没有包含它。 vec3 继承自 vec2
使用vector简单:
std::vector<std::unique_ptr<vec2>> vecs;
vecs.reserve(2); // Optional
vecs.push_back(std::make_unique<vec2>(1.8 ,1.7));
vecs.push_back(std::make_unique<vec2>(1.99, 1.7));
for (auto& v : vecs)
cout << v->toString() << endl;
如果你有virtual
成员函数,那么析构函数很可能也应该是virtual
。
【讨论】:
复制构造函数被调用了吗? @user366866,没有。 使用emplace_back
并保留怎么样?
1. reserve
- 可能,是的。 2.如果使用std::make_unique
,则emplace_back
和push_back
是等价的(比如微软STL中push_back
取T&&
的重载只是调用emplace_back
),emplace_back
可以和@一起使用987654334@:emplace_back(new vec2(1, 2))
,不过make_unique
更好,***.com/questions/22571202/…以上是关于如何将其切换到 unique_ptr?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 unique_ptr 从一组移动到另一组? (C++)
如何将 unique_ptr 捕获到 lambda 表达式中?
使用和不使用移动从 unique_ptr 构造 shared_ptr?
如何 push_back unique_ptr 参数到共享 ptr 的向量上