C++::vector如何保存自己的类

标签 c++ vector

这是我自己的点类(Point.h):

class Point {
public:
    Point(double x, double y, double z);
    Point(const Point& orig);
    virtual ~Point();
    double getX();
    double getY();
    double getZ();
    void writeOut();
private:
    double x, y, z;
};

我在这里创建一个点并将其添加到 vector<Point> ( main.cpp ):

Point* p = new Point(0.1,0.2,0.3);
vector<Point>* points = new vector<Point>;
points->push_back(*p);
//doing stuff
delete points;

我的问题:vector 是复制 Point 并存储它(所以我也需要 delete p;),还是存储之前创建的一个实例?

更新:

我读了here push_back “在 vector 的末尾添加一个新元素,在其当前最后一个元素之后。val 的内容被复制(或移动) 到新元素。”但是哪一个?复制还是移动?它是如何确定的?

最佳答案

vector points 正在存储通过 push-back 传递的 Point 的拷贝(*p).

在您的代码中,当points 被销毁(通过delete)时,包含的对象将被销毁,但您使用new Point< 创建的指针不会被销毁 (p),因为创建了拷贝。

如果您不需要使用动态分配(在这种情况下您似乎不需要),只需将所有内容视为堆栈分配的对象并传递它即可。

Point p{ 0.1, 0.2, 0.3 };
std::vector<Point> points;
points.push_back(p);
// Do stuff with points

否则,如果您需要动态分配,请使用类似 std::unique_ptr 的东西或 std::shared_ptr (或另一个 smart pointer )以便当 vector 被破坏时,包含的指针也是如此。

Point *p = new Point{ 0.1, 0.2, 0.3 };
std::vector<std::unique_ptr<Point>> points;
points.push_back(std::make_unique<Point>(0.1, 0.2, 0.3));

通常,在 C++11 中使用移动语义,大多数时候您可能不需要像这样管理内存(使用 newdelete) .

根据是否为右值来确定传递给push_back 的对象是否被复制或移动。有关详细信息,请阅读 this answer on move semantics .如前所述,您还可以使用 std::vector::emplace_back以保证不执行任何拷贝。

关于C++::vector如何保存自己的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35754891/

相关文章:

java - 如何将法线转换为度数?

c++ - 人脸识别英特尔感知计算

c++ - C++中获取/设置方法变量的方法声明的编程风格?

c++ - C++的SVM教程

C++错误未声明的标识符

vector - Rust中的Vec <(i64,i64)>数据类型是什么?

c++ - 如何将字符串 vector 传递给 execv

Python - 将字符传递给 C 库

c - 在 C 中将矩阵的列转换为单个 vector 的正确方法是什么?

c++ - 有什么办法可以将 vector 推回到 vector 中吗? C++