缩短字节向量上的push_back系列

时间:2009-12-27 22:44:45

标签: c++ vector

在我的代码中,我想使用字节向量将一些数据存储在内存中。问题是,我当前的方法使用了许多行代码:

std::vector<byte> v;
v.push_back(0x13);
v.push_back(0x37);
v.push_back(0xf0);
v.push_back(0x0d);

如何缩短此程序,以便我有例如:

std::vector<byte> v(4) = "\x13\x37\xf0\x0d"; // example code - not working

6 个答案:

答案 0 :(得分:6)

boost assignment library为这类事情提供了许多有用的帮助。文档中的第一个示例是

#include <vector>
#include <boost/assign/std/vector.hpp> // for 'operator+=()'
#include <boost/assert.hpp>; 
using namespace std;
using namespace boost::assign; // bring 'operator+=()' into scope

vector<int> v; 
v += 1,2,3,4,5,6,7,8,9;

答案 1 :(得分:4)

一些较新的编译器支持向量的大括号初始化:

vector<byte> v = {0x13, 0x37, 0xf0, 0x0d};

如果编译器不支持该构造,您可以按照以下方式执行以下操作:

const byte initData[] = {0x13, 0x37, 0xf0, 0x0d};
std::vector<byte> v(initData, initData + sizeof(initData));

这只是从const只读内存复制到你的实时向量中。

答案 2 :(得分:4)

此解决方案从文字本身获取字符串长度,这意味着您不需要额外的5s和4s:

const unsigned char src[] = "\xDE\xAD\xBE\xEF";
std::vector<unsigned char> pattern(src, src+sizeof(src));

注意,在数组中添加了一个空终止符(额外的零字节); sizeof(src)是5,因为它是一个字符串文字。可以通过说sizeof(src)-1或者执行以下操作来丢弃null终止符:

const unsigned char src[] = {0xDE, 0xAD, 0xBE, 0xEF};

答案 3 :(得分:2)

copy_n("\x13\x37\xf0\x0d",4,std::back_inserter(v));

答案 4 :(得分:2)

作为提升分配的替代方法(请参阅我的其他答案),只需定义帮助

即可
inline std::vector<byte>& operator<<(std::vector<byte>& v,byte x)
  {v.push_back(x);return v;}

然后你可以写

 std::vector<byte> v;
 v << 0x13 << 0x37 << 0xf0 << 0x0d;

显然你可以在容器和/或包含类型上模拟帮助器以使其更通用(但最终你只需要重新实现boost赋值)。

答案 5 :(得分:1)

我现在找到了一个解决方案:

std::vector<byte> pattern(5);
memcpy(&pattern[0], "\xDE\xAD\xBE\xEF", 4);

现在问题转变为:哪个答案最干净,最“最好”?