c++ - 是否可以使用 STL 算法重写我的代码?
问题描述
我有一个嵌套循环,我希望使用 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;
解决方案
看起来您想表示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));
});
推荐阅读
- c# - 状态码 405、PUT 和 DELETE 操作方法是不允许的
- google-apps-script - 使用 Apps 脚本在幻灯片中清除文本格式
- python - 将 Django 后端中的大文件从 Angular 前端重定向到 Hadoop 时出错
- c# - C# - 端口扫描器
- php - 在ajax请求中阻止执行php脚本
- sonarqube - SonarQube 看不到 find typescript 项目,除非它在 netcore 项目下
- jquery - 移动菜单不适用于 wordpress zerif 主题
- r - 有没有办法在不转义命令的情况下运行系统命令
- kubernetes - 使用 Traefik + Kubernetes 管理超过 2k Let'sEncrypt 证书
- php - PHP 推送通知中的 sprintf