指针是否可能在没有任何数据副本的情况下被向量所拥有
Is it possible that a pointer gets owned by a vector without any data copy?
如果我有一个C类型的原始指针,是否可以从拥有指针数据的同一类型创建一个std::vector
,而不需要任何数据副本(仅移动)?促使我提出这个问题的是std::vector
的data()
成员函数的存在性,这意味着向量的元素连续地存在于内存中的某个地方。
编辑:我必须补充一点,像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
};
}
否,std::vector
的设计不能假定/利用预先存在的阵列作为其内部存储。
是的,前提是您在获取指针之前已经创建并填充了向量,并且您不会
- 擦除任何元素
- 当
vec.size() == vec.capacity() - 1
、、时,将不会添加新元素,这样做将更改元素的地址
示例
#include <iostream>
void fill_my_vector<std::vector<double>& vec){
for(int i=0; i<300; i++){
vec.push_back(i);
}
}
void do_something(double* d, int size)
{ /* ..... */ }
int main(){
std::vector<double> vec;
fill_my_vector(vec);
//You hereby promise to follow the contract conditions, then you are safe doing this
double* ptr;
int ptr_len = vec.size();
ptr = &vec[0];
//call do_something
do_something(ptr, ptr_len);
//ptr will be alive until this function scope exits
}
编辑
如果您的意思是管理已经创建的阵列中的数据,则不能。。。vector管理自己的数组。。。它不能拥有不是由其类(向量)创建的数组的所有权。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 给定一个填充无符号字符**的 C 函数,如何在没有中间副本的情况下用数据填充 std::vector
- 复制指针,在不更改原始指针的情况下更改副本指向的内容?
- 指针是否可能在没有任何数据副本的情况下被向量所拥有
- 为什么编译器在这种情况下没有省略副本构造
- 如何在不使用副本的情况下更改QJson层次结构中的QJsonObject值
- 特征:如何防止大型对象的额外副本;在RHS上未实现完整矩阵的情况下分配结果
- 在不创建多个副本的情况下,可以在递归函数中执行命中和尝试矩阵吗?
- std::在没有提供副本的情况下,使用不安全的移动调整矢量大小