c++ - 在投射对象时复制与移动
问题描述
我正在尝试为线性代数列向量实现一个类。我有以下代码片段,我尝试在不复制任何内容的情况下投射对象。
#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
,它尽可能快地完成了这项工作。
解决方案
您不需要编写复制和移动构造函数,因为如果唯一的行为是复制/移动std::vector
成员,编译器将隐式生成它们。
顺便说一句,您可能希望将您ColumnVector
的视图实现为Vector
(类似的std::string_view
),这样甚至没有移动。
推荐阅读
- vue.js - Nuxt JS - 在安装中重用异步调用(axios get)?
- python - TypeError('请求的 url 必须是 str 或 unicode,得到 %s:' % type
- excel - Excel 索引来检查开始日期 - 结束日期以及其间的所有日期
- java - apache cxf 仍在生成代码中使用旧依赖项
- mysql-workbench - 在mysql中拆分夜班时间并将工作时间分成两部分
- java - 如何使用 if else 语句检查用户是否输入了与数组列表索引相关的有效条目?
- python - 我认为 random.randint 似乎不起作用
- java - 实现合并排序算法的具体问题
- r - 如何将数据从整洁的格式转换为独特的格式?
- spring - 在 Spring Boot 控制器中转储 thymeleaf 对象/变量