c++ - 指针是否有可能在没有任何数据拷贝的情况下由 vector 拥有?

标签 c++ c++11 vector move

如果我有一个 C 类型的原始指针,是否可以从拥有指针数据的相同类型创建一个 std::vector 而无需任何数据复制(仅 move )?促使我问这个问题的是 std::vectordata() 成员函数的存在,这意味着 vector 的元素连续驻留在内存中的某个地方。

编辑:我必须补充一点,std::make_shared 等函数的存在也加强了我的希望。

最佳答案

我认为这不可能直接实现,尽管您不是第一个错过此功能的人。对于没有非 const data 成员的 std::string 来说更加痛苦。希望这会在 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
  };
}

关于c++ - 指针是否有可能在没有任何数据拷贝的情况下由 vector 拥有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36362757/

相关文章:

c++ - 矩阵和 vector 乘法,输出不正确的乘积

C++ vector : Assert when using vector array index -1?

c++ - 如何删除已解除引用的对象?

c++ - Linux 键盘扫描码问题 : For example, UP ARROW 给出 ^[[A

c++ - 从外部代码加载阶段

c++ - "object"中的 "object file"是什么,为什么这样调用它?

c++ - 如何在运行时确定 exception_ptr 指向的异常类型?

templates - 为什么使用可变参数模板参数初始化我的对象需要定义移动构造函数?

c++ - 是否可以确定一个类型是否是作用域枚举类型?

c++ - 在 vector 中插入元素会损坏指向 vector 的指针吗?