2017-10-11 84 views
0

我需要猛烈地写入矢量(以避免多余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我不能修改。

+2

'resize',而不是'reserve'(和'大小()',而不是'容量()' )? – Jarod42

+0

force_actual_size正在调整大小。 – 2017-10-11 10:03:49

+0

@ manni66:当OP使用它时,你会用''\ 0''覆盖数据。 – Jarod42

回答

3

您可以使用std::vector::resize分配你需要的内存和还正确地更新向量的大小:

std::vector<char> v; 
v.resize(50); 
const auto new_size = read_data(v.data(), v.size()); 
v.resize(new_size); 
+0

@ Jarod42:哎呦,固定。 –

+0

也许会添加一些解释为什么OP的版本不起作用?我认为这会有所帮助。 – Knoep

+0

它的工作原理!我只对第一个'resize'(当然,在现实生活中,我的数据大大超过50个字节)中的整个向量零的初始化过程感到遗憾。 –