如果向量不是 8 的倍数,则用 0 填充向量

Padding a vector with 0's if it's not a multiple of 8

如果向量不是 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;
  }
}

小事有什么不好

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

哪个会追加零直到元素个数是 8 的倍数?

考虑到您如何弥补大小,重新分配的可能性在这里是一个转移注意力的问题。

对于 std::vector 你可以使用 insert:

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

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

计算出您要添加多少 0,然后 insertend

更新: 一行(下面的原始版本更具可读性):

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


注意:最初 post 建议 reserve + insert,但 resize 会以更简洁的方式执行相同的操作。

怎么样:

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);