如果向量不是 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
,然后 insert
在 end
。
更新: 一行(下面的原始版本更具可读性):
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);
如果向量不是 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
,然后 insert
在 end
。
更新: 一行(下面的原始版本更具可读性):
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);