以有效的方式将 C 字符串转换为 std::vector<byte>
Posted
技术标签:
【中文标题】以有效的方式将 C 字符串转换为 std::vector<byte>【英文标题】:Converting a C-string to a std::vector<byte> in an efficient way 【发布时间】:2009-10-16 18:04:02 【问题描述】:我想将 C 风格的字符串转换为字节向量。 一个可行的解决方案是手动转换每个字符并将其推送到向量上。但是,我对这个解决方案并不满意,想找到一种更优雅的方式。
我的尝试之一如下:
std::vector<byte> myVector;
&myVector[0] = (byte)"MyString";
哪些错误让我得到了一个
错误 C2106:'=':左操作数必须是左值
这样做的正确方法是什么?
【问题讨论】:
【参考方案1】:最基本的东西是这样的:
const char *cstr = "bla"
std::vector<char> vec(cstr, cstr + strlen(cstr));
当然,知道长度就不用计算了。
更常见的解决方案是使用std::string
类:
const char *cstr;
std::string str = cstr;
【讨论】:
必须使用 std::vetorvector
等 STL 容器总是拥有所有权,即它们管理自己的内存。您不能修改由 STL 容器内部管理的内存。因此,您的尝试(以及任何类似的尝试)注定要失败。
唯一有效的解决方案是复制内存或编写一个新的 STL 样式容器,该容器不获取它所访问的内存的所有权。
【讨论】:
您不能强制 STL 容器使用您分配的存储空间,不。但是您可以通过vector::resize()
或vector::reserve()
修改容器的存储:)
allocator_traits 呢?即,如果您制作自定义 allocator_traits 并分配给向量?
@Konrad Rudolph - 我有类似的情况,我从 argv 收到几个 C 风格的字符串(用空格分隔),我希望将它们“连接”成一个向量如果您不想复制原始字符串,而只想将其作为字节数组进行迭代,那么 C++20 可以提供 std::span
。
auto const const_bytes = std::as_bytes(std::spanstr.data(), str.size());
std::span<const std::byte>
提供 std::vector
之类的迭代功能,我认为这正是您可能需要的。
注意:原始字符串必须在 std::span
变量的整个范围内保持有效
【讨论】:
【参考方案4】:按照这些思路应该可以工作
std::vector<byte> myVector = std::vector((byte*)cstring, (byte*)ctring + strlen(cstring))
此外,这仍然只是遍历 c 字符串并将值插入向量中。正如 Konrad 所说,这就是你必须这样做的方式,因为向量管理它们自己的内存。
【讨论】:
【参考方案5】:std::vector<byte> myVector;
const char* str = "MyString";
myVector.assign( str, str+strlen(str) );
【讨论】:
【参考方案6】:最明显的问题是为什么你不只使用 std::string:
std::string myString("MyString");
但如果你真的认为你需要一个向量:
char myString[] = "MyString";
std::vector<byte> myVector(myString, myString+sizeof(myString));
您可能还想考虑使用 std::tr1::array:
std::tr1::array<byte, sizeof("MyString")> myArray = "MyString";
C++ 0x 也会有std::array
。
【讨论】:
对我来说一个更明显的问题是:他首先从哪里获得 char 数组(除非某些库函数分配并返回它)?【参考方案7】:const char *cstr = "bla"
std::vector<char> vec;
vec.resize(strlen(cstr)+1);
strcpy(&vec[0],cstr);
【讨论】:
以上是关于以有效的方式将 C 字符串转换为 std::vector<byte>的主要内容,如果未能解决你的问题,请参考以下文章
c语言中怎么把两个已经以字符串方式存起来的时间相减,得到时间差