从不复制的 char 指针创建 std:char 数组
Posted
技术标签:
【中文标题】从不复制的 char 指针创建 std:char 数组【英文标题】:Create a std:array of char from a char pointer without copy 【发布时间】:2021-03-16 14:41:02 【问题描述】:在 C++ 中,是否可以在不复制数据的情况下从 char 指针创建 std::array of char(或 std::vector)?
我知道我可以写这样的东西,但是数据被复制到数组中,没有优化:
#define BUFFER_SIZE 256
...
char *buffer;
std::array<char, BUFFER_SIZE> data(buffer, buffer + BUFFER_SIZE);
我想要一个通过指针传递数据而不复制数据的解决方案。
【问题讨论】:
简短回答:不。标准容器拥有自己的数据。 标准容器对谁管理他们的数据相当挑剔。你有没有从一开始就没有使用std::array
的原因?
你想达到什么目的?如果你想让指针加大小更像一个容器,C++20 中有std::span
。
@largest_prime_is_463035818:我的数组包含字节可能等于 0 的原始数据,因此字符串不是可能的解决方案。实际上,我有一个根据 Qt (QByteArray) 生成数据的类,我想改用标准容器类。
错误前提:“我的数组包含字节可能等于 0 的原始数据,因此字符串不是可能的解决方案。”这不是很明显,但是std::string
可以在中间包含0
,您只需要小心那些假设std::string
包含以null 结尾的字符串的方法,否则没问题。
【参考方案1】:
不,不是。数组和向量拥有它们的数据。字符串是一样的。
我想要一个通过指针传递数据而不复制数据的解决方案。
嗯,你总是可以通过引用传递,但当然,如果你在例行程序中改变它......好吧......它会改变它。
对于字符,您可以使用 COW 字符串 (Moooooo!) 或 Copy On Write 字符串。这里的想法是,仅当您实际尝试更改字符串时才制作字符串数据本身的副本。所以这是两全其美的。不幸的是(或者幸运的是,取决于您的观点)标准库字符串不是一个。如果我没记错的话,一些旧的 STL 字符串曾经是这样实现的。如果您相当精通 C++,您当然可以在短时间内编写自己的代码,或者您可能会在某个地方找到一个浮动的实现。我有一个我已经使用了 30 年的,它对我的目的来说足够好用了。
【讨论】:
以上是关于从不复制的 char 指针创建 std:char 数组的主要内容,如果未能解决你的问题,请参考以下文章
no suitable ctr exists to convert from 'int' to 'std::basic_string<char,std::char_tra
[C++][原创]std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)’未定义的引用
ngrest kyai编译报错:undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char
ngrest kyai编译报错:undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char
undefined reference to `cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::all
undefined reference to `cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::all