首页 > 解决方案 > 在投射对象时复制与移动

问题描述

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

#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,它尽可能快地完成了这项工作。

标签: c++oopcastingmovemove-semantics

解决方案


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

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


推荐阅读