在我的代码中,我想使用字节向量将一些数据存储在内存中。问题是,我当前的方法使用了许多行代码:
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
答案 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);
现在问题转变为:哪个答案最干净,最“最好”?