以旧式(脏)方式填充矢量
我需要猛烈地写入矢量(以避免多余memcpy
)。以旧式(脏)方式填充矢量<char>
让我们考虑这个非常简单的一段代码
unsigned read_data (char * buffer , unsigned maxsize)
{
const char * data = "Hi folks! I'm the data" ;
unsigned size = strlen(data) ;
if (size > maxsize) return 0 ;
memcpy(buffer,data,size) ;
return size ;
}
void main()
{
std::vector<char> v ;
v.reserve(50) ;
unsigned size = read_data(v.data(),v.capacity()) ;
v.force_actual_size(size) ;
}
这里是我想象的方式:数据实际写入的载体,但载体的大小仍然是0。 所以我需要这个force_actual_size
方法...
有没有办法实现它,或者更好,干净的方式来做同样的事情。
当然的,read_data
来自一个老式API我不能修改。
您可以使用std::vector::resize
分配你需要的内存和还正确地更新向量的大小:
std::vector<char> v;
v.resize(50);
const auto new_size = read_data(v.data(), v.size());
v.resize(new_size);
@ Jarod42:哎呦,固定。 –
也许会添加一些解释为什么OP的版本不起作用?我认为这会有所帮助。 – Knoep
它的工作原理!我只对第一个'resize'(当然,在现实生活中,我的数据大大超过50个字节)中的整个向量零的初始化过程感到遗憾。 –
'resize',而不是'reserve'(和'大小()',而不是'容量()' )? – Jarod42
force_actual_size正在调整大小。 – 2017-10-11 10:03:49
@ manni66:当OP使用它时,你会用''\ 0''覆盖数据。 – Jarod42