【问题标题】:Populate a vector<char> in an old fashioned (and dirty) way以老式(且肮脏)的方式填充 vector<char>
【发布时间】:2017-10-11 09:56:55
【问题描述】:

我需要暴力写入一个向量(避免多余的memcpy)。

让我们考虑一下这段非常简化的代码

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。

【问题讨论】:

  • resize 代替 reserve(和 size() 代替 capacity())?
  • force_actual_size 正在调整大小。
  • @manni66:当 OP 使用它时,你会用 '\0' 覆盖数据。
  • 这样做的动机是什么?您是否试图避免双重初始化?
  • @Jarod42 read_data 不关心'\0'。

标签: c++ vector stl memcpy


【解决方案1】:

您可以使用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 的版本不起作用?我认为这会有所帮助。
  • 它有效!我只后悔在第一个 resize 处将整个向量的多余初始化为零(当然,在现实生活中,我的数据远远大于 50 个字节)。
  • @Captain'Flam:如果您需要这种级别的细粒度控制,请考虑在非零可调整大小的缓冲区上创建自己的抽象。
猜你喜欢
  • 2010-09-08
  • 2018-08-16
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
相关资源
最近更新 更多