指针是否有可能在没有任何数据复制的情况下被向量拥有?

2023-11-29

如果我有一个 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(使用前将#替换为@)

指针是否有可能在没有任何数据复制的情况下被向量拥有? 的相关文章

随机推荐