[英]Increase elements inside std::vector<T> depending on std::bitset<N>
我想將長度為256
的std::vector<size_t>
中的每個元素增加一,但要取決於std::bitset<256>
相同位置(如果等於1
)。
下面的代碼可以在這里進行編輯/編譯。
我的問題是,我可以擺脫for
循環而進入一些快速邏輯運算符嗎?
#include <iostream>
#include <bitset>
#include <vector>
#include <iterator>
#include <algorithm>
#define SIZE 3
int main() {
size_t size=SIZE;
std::vector<size_t> v(SIZE); v={3,0,7};
std::bitset<SIZE> b("110");
for (size_t i=0; i<size; ++i)
{
if (b[size-1-i]) // reverse
{
++v[i];
}
}
std::copy ( v.begin()
, v.end()
, std::ostream_iterator<size_t>(std::cout, ",") );
// 3+1,0+1,7+0
// => 4,1,7
return 0;
}
由於bitset
沒有迭代器,因此我們不能簡單地使用std::transform
。 但是我們可以在size_t
周圍創建類似迭代器的包裝器,並像索引一樣使用它:
#include <iostream>
#include <bitset>
#include <vector>
#include <iterator>
#include <algorithm>
#define SIZE 3
class IntegralIterator
{
public:
IntegralIterator(size_t v = 0) : value(v) {}
size_t operator*()
{
return value;
}
IntegralIterator& operator++()
{
++value;
return *this;
}
private:
size_t value;
};
int main() {
size_t size=SIZE;
std::vector<size_t> v(SIZE); v={3,0,7};
std::bitset<SIZE> b("110");
std::transform(v.begin(), v.end(), IntegralIterator(), v.begin(),
[&](size_t s, size_t index)
{
return s + b[size-1-index];
});
std::copy(v.begin(), v.end(),
std::ostream_iterator<size_t>(std::cout, ",") );
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.