我有一个参考std::vector<char>
我想用作接受的函数的参数std::vector<unsigned char>
。我可以在不复制的情况下做到这一点吗?
我有以下功能并且有效;但是我不确定副本是否真的发生 - 有人可以帮助我理解这一点吗?是否可以使用std::move
以避免复制还是已经没有被复制?
static void showDataBlock(bool usefold, bool usecolor,
std::vector<char> &chunkdata)
{
char* buf = chunkdata.data();
unsigned char* membuf = reinterpret_cast<unsigned char*>(buf);
std::vector<unsigned char> vec(membuf, membuf + chunkdata.size());
showDataBlock(usefold, usecolor, vec);
}
我想我可以写:
std::vector<unsigned char> vec(std::move(membuf),
std::move(membuf) + chunkdata.size());
这是否太过分了?到底发生了什么?
如果你有一个v1
类型的std::vector<T1>
并需要一个v2
类型的std::vector<T2>
即使 T1 和 T2 “相似”,也无法复制数据char
and unsigned char
.
使用标准库:
std::vector<unsigned char> v2;
std::copy(v1.begin(), v1.end(), std::back_inserter(v2));
解决这个问题的唯一可能的方法是以某种方式仅使用一种类型:要么获得std::vector<T2>
如果可能的话,从一开始,或者与std::vector<T1>
从现在开始(也许添加一个处理它的重载)。或者创建可以处理任何[连续]容器的通用代码(模板)。
我认为reinterpret_cast和std::move应该可以
避免复制
不,不能
请详细说明 - 为什么不呢?
向量只能从相同类型的另一个向量窃取资源(移动数据)。这就是它的界面的设计方式。
要执行您想要的操作,您需要一个 release() 方法,该方法将释放基础数据的向量所有权并将其作为(唯一)指针返回,以及一个移动构造函数/赋值,该方法将从(唯一)指针获取基础数据。 (即便如此,你仍然需要一个reinterpret_cast
这是...危险区域)
std::vector
这些都没有。也许应该有。事实并非如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)