C++ 将结构添加到字节向量,然后添加另一个

C++ 将结构添加到字节向量,然后添加另一个,c++,arrays,vector,structure,C++,Arrays,Vector,Structure,我有各种各样的结构,包括整数类型和整数类型的数组,以及我想添加到无符号字符向量中的无符号字符数组 因此,给定以下伪代码: struct { short x; short sz; unsigned char y; unsigned char w; unsigned char z[ 2 ]; } example_struct; example_struct ex_s; unsigned char array[ <some val-could be several thousand> ]

我有各种各样的结构,包括整数类型和整数类型的数组,以及我想添加到无符号字符向量中的无符号字符数组

因此,给定以下伪代码:

struct
{
short x;
short sz;
unsigned char y;
unsigned char w;
unsigned char z[ 2 ];
} example_struct;

example_struct ex_s;
unsigned char array[ <some val-could be several thousand> ];
我看了这个问题: 我写了以下内容:

std::vector< unsigned char > v( sizeof( example_struct ) + array_len );
unsigned char * ptr = reinterpret_cast< unsigned char * >( &ex_s );
std::vector< unsigned char > tmp_v( ptr, ptr + sizeof( example_struct ) );
v = tmp_v;
std::vector< unsigned char > tmp_v2( array, array + array_len );
v.insert( v.end(), tmp_v2.begin(), tmp_v2.end() );
有没有更容易阅读的方法

使用结构的内容创建v是否比为其分配临时变量更有效

如果这样做了,那么v就不是最终长度的大小,在添加数组时,很可能会通过向量进行另一次内存分配。创建空向量后保留总长度加上加法是否更可取

交换优先于转让吗

插入是添加第二个向量的首选方法吗


关于如何编写此文件的任何其他建议?

您不需要创建临时向量,只需使用insert即可,例如:

注意,在我的示例中,您也不需要或者不想给向量一个初始大小。但是,您可能希望提前保留容量,这是一种简单的优化方法,即使有时为时过早:

v.reserve(sizeof(example_struct) + array_len); // <- prior to inserts
另外,请注意,结构成员填充可能会导致其在向量中的表示形式与您期望的不同;或者至少在编译器之间是不一致的。您需要使用1字节的打包;特定于编译器的选项,例如或。否则,结构成员之间可能会有垃圾填充字节


一种真正可移植的方法是按值插入每个成员,一次插入一个,并在短字符上使用位操作来强制endianness,而不是转换指针或进行字节复制。

当然!这很有道理。谢谢。@Grasshopper顺便说一句,您不必在这个特殊情况下使用reinterpret_cast,但它非常清楚地表明了您的意图,所以,不要将我的代码片段视为反对它的理由。这个问题对于堆栈溢出来说太宽泛了,这是关于使用明确答案编码的特定问题。这更适合于或。请阅读更多信息。
v.reserve(sizeof(example_struct) + array_len); // <- prior to inserts