【问题标题】:Padding a vector with 0's if it's not a multiple of 8如果向量不是 8 的倍数,则用 0 填充
【发布时间】:2018-03-06 11:51:39
【问题描述】:

如果向量不是 8 字节的倍数,如何用 0 填充? 在下面的代码中,我计算出偏移量并添加到向量中以确保它始终具有 8 个值。我想用 0 填充它,我想知道最有效的方法是什么。

例如:

输入:4444

带内边距:4444000000000000

我目前的代码是:

if ((vector1.size() % 8) != 0)
{
  for (std::vector<unsigned char>::iterator itr = vector1.begin(); itr != vector1.end(); itr ++)
  {
    vector1.push_back(fmod(vector1.size(), 8));

    if(vector1.size() == 8)
      break;
  }
}

【问题讨论】:

  • 要添加的 0 的数量是 (8 - (vector1.size() % 8)) % 8 如果没有最后一个 % 8,长度已经为 8 的向量将再添加 8 个 0。

标签: c++ c++11 vector padding fmod


【解决方案1】:

琐碎的有什么问题

while (vector1.size() % 8){
    vector1.push_back(0);
}

在元素个数是 8 的倍数之前会追加零?

考虑到你是如何构成规模的,重新分配的可能性在这里是一个红鲱鱼。

【讨论】:

  • 投票赞成,因为最后一句话非常中肯。摊销常数 push_back 和尺寸选择应该很好地结合在一起。
【解决方案2】:

对于std::vector,您可以使用insert

iterator insert( const_iterator pos, size_type count, const T& value );

(以前是void insert( iterator pos, size_type count, const T&amp; value );

算出你想添加多少个0s,然后在endinsert

【讨论】:

    【解决方案3】:

    更新:单行(下面是更易读的原始版本):

    vec.resize(vec.size() + (8 - vec.size() % 8) % 8, 0);
    

    这是应该非常有效的代码。它避免了多次重新分配,并且在不需要填充时什么也不做。

    const size_t nonPaddedSize = vec.size();
    const size_t numPaddingElements = (8 - nonPaddedSize % 8) % 8;
    if(numPaddingElements > 0)
        vec.resize(nonPaddedSize + numPaddingElements, 0);
    

    这是live-example


    注意:最初帖子建议reserve + insert,但resize 会以不那么冗长的方式做同样的事情。

    【讨论】:

    • 这很好用,因此我接受这个答案。谢谢 AMA。
    • @Zeus7 很高兴它有帮助。
    • 很好:这是您在无符号类型中使用减法知识的试金石。
    【解决方案4】:

    怎么样:

    constexpr std::size_t ceil_to_multiple(std::size_t n, std::size_t mul)
    {
        return (n + mul - 1) / mul * mul;
    }
    

    然后

    vector1.resize(ceil_to_multiple(vector1.size(), 8), 0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-04
      • 2021-04-30
      • 2021-04-20
      • 2020-10-29
      • 2022-11-27
      • 2021-01-26
      • 2020-04-07
      • 2023-03-10
      相关资源
      最近更新 更多