投射物体时复制与移动

Copying vs Moving while casting objects

我正在尝试为线性代数列向量实现 class。我有以下代码片段,我尝试在不复制任何内容的情况下转换对象。

#include <iostream>
#include <fstream>
#include <cassert>
#include <vector>

using namespace std;

class Vector
{
    public:
    std::vector<int> vect;

    public:
    Vector() = default;

    Vector(const Vector& v):vect(v.vect){ };

    Vector(Vector&& v)
    {
        vect.swap(v.vect);
    }

    Vector(const std::vector<int>& v)
    {
        vect = v;
    }

    Vector(std::vector<int>&& v)
    {
        vect.swap(v);
    }

    auto begin()
    {
        return vect.begin();
    }

    auto end()
    {
        return vect.end();
    }
};

class ColumnVector: public Vector
{
    public:
    ColumnVector() = default;

    ColumnVector(const ColumnVector& v)
    {
        this->vect = v.vect;
    }

    ColumnVector(ColumnVector&& v)
    {
        this->vect.swap(v.vect);
    }

    ColumnVector(Vector&& v)
    {
        this->vect.swap(v.vect);
    }
};


int main()
{
    Vector v(vector<int>({ 1, 2, 3, 4, 5 }));

    ColumnVector cv = ( ColumnVector&& )v;

    for ( auto it = v.begin(); it != v.end(); it++ )
        cout << *it << " ";
    // nothing printed -- seems that data have been moved

    for ( auto it = cv.begin(); it != cv.end(); it++ )
        cout << *it << " ";
    // 1 2 3 4 5
}

我尝试在不进行任何复制的情况下投射对象。速度是必不可少的,所以我想知道我是否做对了。另外,伙计们,你们有什么优化技巧可以用于这个代码片段吗?

决赛: 我决定使用 std::move,它尽可能快地完成工作。

您不需要编写复制和移动构造函数,因为如果唯一的行为是 copy/move std::vector 成员,编译器将隐式生成它们。

顺便说一下,您可能希望将 ColumnVector 实现为 Vector 的视图(类似于 std::string_view),这样甚至没有移动。