如果我有一个 C 类型的原始指针,是否可以创建一个std::vector
来自拥有指针数据的同一类型,没有任何数据复制(仅移动)?促使我问这个问题的原因是data()
成员函数为std::vector
这意味着向量的元素连续驻留在内存中的某个位置。
编辑:我必须补充一点,像这样的函数的存在也增强了我的希望std::make_shared
.
我认为这不可能直接实现,尽管您不是第一个错过此功能的人。更痛苦的是std::string
其中没有非const
data
成员。希望这会在 C++17 中改变。
不过,如果您自己分配缓冲区,则有一个解决方案。只需使用一个std::vector
预先。例如,假设您有以下 C 风格函数,
extern void
fill_in_the_numbers(double * buffer, std::size_t count);
那么你可以执行以下操作。
std::vector<double>
get_the_numbers_1st(const std::size_t n)
{
auto numbers = std::vector<double> (n);
fill_in_the_numbers(numbers.data(), numbers.size());
return numbers;
}
或者,如果你没那么幸运并且你的 C 风格函数坚持自己分配内存,
extern double *
allocate_the_buffer_and_fill_in_the_numbers(std::size_t n);
你可以求助于std::unique_ptr
,这是可悲的劣势。
std::unique_ptr<double[], void (*)(void *)>
get_the_numbers_2nd(const std::size_t n)
{
return {
allocate_the_buffer_and_fill_in_the_numbers(n),
&std::free
};
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)