需求,从一个字符串里面,解析出一个数组。
例如:
“1,2,3,4,5”,
"1-5",
"1,2,4",
"5-10,
12,13"
能正常解析出一个数组出来。字符串里面,支持“,”, "-" 2种用法。
#include <iostream> #include <string> #include <vector> #include <sstream> #include <unordered_map> std::vector<int> parseStringToInts(const std::string& input) { std::vector<int> result; std::string token; std::stringstream ss(input); std::unordered_map<int, int> unorderMap;//去重判断 while (std::getline(ss, token, ',')) { // 检查是否包含'-',表示范围 size_t dashPos = token.find('-'); if (dashPos != std::string::npos) { // 提取范围的两个数字 int start, end; std::stringstream startStream(token.substr(0, dashPos)); std::stringstream endStream(token.substr(dashPos + 1)); if (startStream >> start && endStream >> end && start <= end) { // 添加范围内的所有数字 for (int i = start; i <= end; ++i) { if(unorderMap.find(i) == unorderMap.end()){ result.push_back(i); unorderMap[i] = 1; } } } } else { // 否则,尝试将token转换为整数 int num; if (std::stringstream(token) >> num) { if(unorderMap.find(num) == unorderMap.end()){ result.push_back(num); unorderMap[num] = 1; } } // 如果转换失败,忽略此token(可选,取决于你的需求) } } return result; } // 测试示例 void testFun(const std::string& strIds){ std::cout<<"=======================\r\ntestFun strIds:"<<strIds<<std::endl; std::vector<int> result; result = parseStringToInts(strIds); for (int num : result) { std::cout << num << " "; } std::cout << std::endl; } int main() { testFun("1,2,3,4,5"); testFun("1-5"); testFun("1,3,5,7"); testFun("1,3,5-6,7,9"); testFun(""); testFun("1-5,8"); testFun("1-,8"); testFun("-2,8"); testFun("8-8,8"); testFun("8-3"); testFun("-2"); testFun("1-4,6-8"); testFun("1-3,6,7,9-10"); testFun("6,7,9-10,18"); testFun("a"); testFun("b"); testFun("0-5"); return 0; }
标签:std,unorderMap,include,token,num,result,数组,字符串,解析 From: https://www.cnblogs.com/music-liang/p/18358372