Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将原始指针内容移动到向量_C++_C++11_Vector - Fatal编程技术网

C++ 将原始指针内容移动到向量

C++ 将原始指针内容移动到向量,c++,c++11,vector,C++,C++11,Vector,我有一个原始指针 char * ptr = (char *) malloc(LIMIT); size_t size; fill_with_data(ptr, LIMIT, &size); 现在我想使用std::vector包装指针数据 auto v = vector<char>(ptr, ptr + size); auto v=vector(ptr,ptr+size); 但我认为使用上面的语法将生成指针内容的副本。有没有办法将原始指针转换为向量而不复制内存中

我有一个原始指针

char * ptr = (char *) malloc(LIMIT);  
size_t size;  
fill_with_data(ptr, LIMIT, &size);  
现在我想使用
std::vector
包装指针数据

auto v = vector<char>(ptr, ptr + size);
auto v=vector(ptr,ptr+size);

但我认为使用上面的语法将生成指针内容的副本。有没有办法将原始指针转换为向量而不复制内存中的数据?

a
std::vector
imk_不能使用现有的缓冲区

如果要自动管理现有缓冲区的生存期,可以使用智能指针,如
std::unique_ptr
std::shared_ptr


注:
从技术上讲,可以使用自定义分配器诱使
std::vector
使用现有缓冲区,但暴露该缓冲区中的数据必须依赖于实现的不可移植方面。
A
std::vector
imk_无法使用现有缓冲区

如果要自动管理现有缓冲区的生存期,可以使用智能指针,如
std::unique_ptr
std::shared_ptr


注:
从技术上讲,可以使用自定义分配器诱使
std::vector
使用现有缓冲区,但暴露该缓冲区中的数据必须依赖于实现的不可移植方面。

否。矢量是一个容器,它与内存中的基类型数据不同。可以对基类型数据使用类型转换。您不能自己指向向量元素的内存地址。

否。向量是一个容器,它与内存中的基类型数据不同。可以对基类型数据使用类型转换。你不能自己指向向量元素的内存地址。

正如其他人所说,你不能让向量接管其他东西分配的内存。但也许您可以首先使用向量来分配它:

std::vector theData(LIMIT);
size_t size;
fill_with_data(theData.data(), LIMIT, &size);
theData.resize(size);

data()。下面的
resize()
确保向量的行为就像它只包含
size
数据量一样。

正如其他人所说,你不能让向量接管其他东西分配的内存。但也许您可以首先使用向量来分配它:

std::vector theData(LIMIT);
size_t size;
fill_with_data(theData.data(), LIMIT, &size);
theData.resize(size);


data()。以下
resize()
确保向量的行为就像它只包含
size
数据量一样。

“有没有办法将原始指针转换为向量而不复制内存中的数据?”简言之:没有,没有,除非您将自定义分配器与
std::vector
(检查第二个模板参数).@πάνταῥεῖ 你能提出其他的建议吗?只是加强了我的评论。@πάνταῥεῖ 我正在读有关它的书。谢谢。@πάνταῥεῖ 当然如果您有一个30个字符的数组,那么分配器将获得一个64字节的请求。它应该做什么?“有没有办法在不复制内存中数据的情况下将原始指针转换为向量?”简言之:没有,没有,除非您使用带有
std::vector
(检查第二个模板参数)的自定义分配器。@πάνταῥεῖ 你能提出其他的建议吗?只是加强了我的评论。@πάνταῥεῖ 我正在读有关它的书。谢谢。@πάνταῥεῖ 当然如果您有一个30个字符的数组,那么分配器将获得一个64字节的请求。它应该做什么?真正有趣的事情是知道如何编写这样的自定义分配器。你手头有什么例子吗?@πάνταῥεῖ: 现在使用C++11更容易了,我认为您只需要实现
allocate
deallocate
(如果我正确地调用了方法名称)。其余部分通过
分配器属性推断并默认。智能指针选项(尤其是
std::unique\u ptr
)似乎是一条直路。@chearsandhth.-Alf谢谢。我接受这个答案。如果您突然有时间,如果您能提供一个示例,以便其他人在以后的访问中参考,我将不胜感激。真正有趣的事情是知道如何编写这样的自定义分配器。你手头有什么例子吗?@πάνταῥεῖ: 现在使用C++11更容易了,我认为您只需要实现
allocate
deallocate
(如果我正确地调用了方法名称)。其余部分通过
分配器属性推断并默认。智能指针选项(尤其是
std::unique\u ptr
)似乎是一条直路。@chearsandhth.-Alf谢谢。我接受这个答案。如果您突然有时间,如果您能提供一个示例,以便其他人在以后的访问中参考,我将不胜感激。我认为您可以:如果v是vector类型,那么您可以指向像
&v[0]这样的元素
和vector保证元素有连续的地址。我想你可以:如果v是vector类型,那么你可以指向像
&v[0]
这样的元素,vector保证元素有连续的地址。是的,没错。但不幸的是,分配内存的函数是
C
函数。它接受一个
void**
,并给出指向已分配数据的指针。我说的是用于处理zip档案的
miniz库
capi。谢谢你,我很感激你的回答是的,没错。但不幸的是,分配内存的函数是
C
函数。它接受一个
void**
,并给出指向已分配数据的指针。我说的是用于处理zip档案的
miniz库
capi。谢谢,我很感激你的回答