【问题标题】:Is it possible to rewrite my code using STL algorithms?是否可以使用 STL 算法重写我的代码?
【发布时间】:2020-01-19 11:33:08
【问题描述】:

我有一个嵌套循环,我希望使用 STL 算法重写它。有人可以帮帮我吗?

std::bitset<array_size * 8> bitset {};
short bitsetIndex {0};
for (int i = 0; i < array_size; ++i) {
    std::bitset<8> cBitset { (unsigned char) charArray[i] };
    for (int i = 0; i < cBitset.size(); ++i) {
        if(cBitset.test(i)) {
            bitset.set(bitsetIndex);
        }
        bitsetIndex++;
    }
}
return bitset;

【问题讨论】:

标签: c++ stl-algorithm


【解决方案1】:

您似乎想将charArray 表示为位的集合。一个简单的循环和几个位操作就可以完成这项工作:

using Bitset = std::bitset<array_size * 8>;
Bitset bitset;
for (auto i = array_size; i > 0; --i) {
    bitset <<= 8;
    bitset |= Bitset(static_cast<unsigned char>(charArray[i - 1]));
}
return bitset;

根据charArray 是什么,循环也可以用迭代器重写:

using Bitset = std::bitset<array_size * 8>;
Bitset bitset;
for (auto it = std::rbegin(charArray); it != std::rend(charArray); ++it) {
    bitset <<= 8;
    bitset |= Bitset(static_cast<unsigned char>(*it));
}
return bitset;

最后,如果你真的想使用一些标准库算法,你可以使用std::accumulate

using Bitset = std::bitset<array_size * 8>;
return std::accumulate(std::rbegin(charArray), std::rend(charArray), Bitset{}, 
    [](Bitset bs, auto ch) { return (bs << 8) | 
        std::bitset<array_size * 8>(static_cast<unsigned char>(ch));
});

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多