我有一个std :: vector。我想将向量的内容复制到一定大小的char *缓冲区中。
有没有一种安全的方法可以做到这一点?
我可以这样做吗?
memcpy(buffer, _v.begin(), buffer_size);
还是这个?
std::copy(_v.begin(), _v.end(), buffer); // throws a warning (unsafe)
还是这个?
for (int i = 0; i < _v.size(); i++)
{
*buffer = _v[i];
buffer++;
}
谢谢..
答案 0 :(得分:18)
std::copy(_v.begin(), _v.end(), buffer);
这是在C ++中执行此操作的首选方法。如果buffer
足够大,可以安全地复制。
答案 1 :(得分:10)
如果您只需要char*
,那么您可以这样做:
char *buffer=&v[0];//v is guaranteed to be a contiguous block of memory.
//use buffer
注意更改buffer
指向的数据也会更改矢量的内容!
或者,如果您需要副本,则分配大小等于v.size()
字节的内存,并使用std::copy
:
char *buffer = new char[v.size()];
std::copy(v.begin(), v.end(), buffer);
答案 2 :(得分:4)
将vector<char>
复制到char *
缓冲区的最安全方法是将其复制到另一个向量,然后使用该向量的内部缓冲区:
std::vector<char> copy = _v;
char * buffer = ©[0];
当然,如果您实际上不需要复制数据,也可以访问_v
缓冲区。另外,请注意,如果调整矢量大小,指针将无效。
如果需要将其复制到特定的缓冲区中,那么在复制之前你需要知道缓冲区足够大;数组上没有边界检查。一旦你检查了尺寸,你的第二种方法是最好的。 (第一个只有在vector::iterator
是一个指针时才有效,但不能保证;虽然你可以将第二个参数更改为&_v[0]
以使其正常工作。第三个参数做同样的事情,但更复杂,可能应该修复,因此不会修改buffer
)。
答案 3 :(得分:0)
嗯,你想为案例3分配*buffer
,但这应该有效。第一个几乎肯定不会起作用。
编辑:关于#2,我的立场得到了纠正。
答案 4 :(得分:0)
static std::vector<unsigned char> read_binary_file (const std::string filename)
{
// binary mode is only for switching off newline translation
std::ifstream file(filename, std::ios::binary);
file.unsetf(std::ios::skipws);
std::streampos file_size;
file.seekg(0, std::ios::end);
file_size = file.tellg();
file.seekg(0, std::ios::beg);
std::vector<unsigned char> vec(file_size);
vec.insert(vec.begin(),
std::istream_iterator<unsigned char>(file),
std::istream_iterator<unsigned char>());
return (vec);
}
然后:
auto vec = read_binary_file(filename);
auto src = (char*) new char[vec.size()];
std::copy(vec.begin(), vec.end(), src);
但请记住稍后删除[] src