如果向量长度不是8的倍数,需要用0填充

7
如何在向量长度不是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;
  }
}

2
需要添加的0的数量为 (8 - (vector1.size() % 8)) % 8。如果没有最后的 % 8,一个已经长度为8的向量将再次添加8个0。 - Richard Critten
4个回答

19

更新: 简洁版本(更易读的原始版本在下面):

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

这是一个实时示例


注意:原本的文章建议使用reserve+insert,但是resize的方式更简洁且能达到相同的效果。


这个完美地运作了,因此我接受了这个答案。谢谢AMA。 - Zeus7
@Zeus7 很高兴它有帮助。 - AMA
1
不错:这是测试您使用无符号类型减法知识的试金石。 - Bathsheba

8

琐碎的问题有什么不对吗?

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

如何将元素数量增加至8的倍数并添加零?

考虑到您正在编写尺寸,重新分配的潜力在这里是一个红色的诱饵。


2
自从最后一句话非常相关,所以我点赞了。摊销常数的push_back操作和尺寸选择应该很好地配合在一起。 - StoryTeller - Unslander Monica

4

如果你使用的是 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,然后在末尾插入它们。


3
怎么样:
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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接