如何更优雅地将双状态字符串转换为std::bitset?
更优雅地将双状态字符串转换为std::bitset的实现方案
原代码的功能是可行的,但存在可以精简、通用化的空间,比如重复的左移操作、未处理非法字符、参数传递效率等问题。下面是几种更优雅或更具算法性的实现方式:
一、精简基础版本
将重复的左移操作提取到判断逻辑之外,减少冗余代码,同时优化参数传递为const std::string&避免不必要的字符串拷贝:
#include <bitset> #include <string> #include <iostream> std::bitset<70> convertTwoStateString(const std::string& twoState) { std::bitset<70> result; for (char c : twoState) { result <<= 1; if (c == '+') { result.set(0); // 等价于 |= std::bitset<70>{1},语义更清晰 } // 可选:添加非法字符处理,例如: // else if (c != '-') throw std::invalid_argument("Invalid character"); } return result; } int main() { std::string s{"-+--+++--+--+"}; std::bitset<70> set = convertTwoStateString(s); std::cout << set << std::endl; }
二、使用STL算法的函数式风格
利用<numeric>中的std::accumulate,以函数式的方式完成累积转换,更贴合STL的算法设计思想:
#include <bitset> #include <string> #include <iostream> #include <numeric> std::bitset<70> convertTwoStateString(const std::string& twoState) { return std::accumulate(twoState.begin(), twoState.end(), std::bitset<70>{}, [](std::bitset<70> acc, char c) { acc <<= 1; if (c == '+') acc.set(0); // 同样可添加非法字符判断 return acc; }); } int main() { std::string s{"-+--+++--+--+"}; std::bitset<70> set = convertTwoStateString(s); std::cout << set << std::endl; }
三、通用模板版本(支持自定义状态字符和bitset大小)
通过模板让函数支持任意大小的std::bitset,同时允许用户指定代表1和0的字符,适配"yynnny"这类不同状态标识的字符串:
#include <bitset> #include <string> #include <iostream> #include <stdexcept> template <size_t BitsetSize> std::bitset<BitsetSize> convertTwoStateString(const std::string& twoState, char one_char = '+', char zero_char = '-') { std::bitset<BitsetSize> result; for (char c : twoState) { result <<= 1; if (c == one_char) { result.set(0); } else if (c != zero_char) { throw std::invalid_argument("Invalid character in two-state string"); } } return result; } int main() { std::string s{"-+--+++--+--+"}; auto set = convertTwoStateString<70>(s); std::cout << set << std::endl; // 处理"yynnny"这类字符串的示例 std::string s2{"yynnny"}; auto set2 = convertTwoStateString<6>(s2, 'y', 'n'); std::cout << set2 << std::endl; // 输出110001 }
内容的提问来源于stack exchange,提问作者Suslik
相关产品推荐
相关产品推荐

