如何将[[1,4],...]格式的字符串转换为vector<vector<int>>?
如何将嵌套数组格式的字符串转换为vector<vector>?
我完全懂你这种卡在字符串解析上的无奈——明明思路清晰,却被格式问题绊住脚。你的代码方向是对的,但问题出在没处理字符串里的[、]、,这些特殊符号,导致stringstream没法正确识别和提取数字。
先分析你原代码的问题
你用ss>>temp读取时,会把[[1,4],这类包含符号的内容当成一个完整的字符串,而ss2没法从这种混合了符号和数字的字符串里提取出x和y,自然也就没法生成正确的子数组。
解决方案1:逐个字符处理,过滤干扰符号
这种方法更直观,遍历字符串的每个字符,只收集数字,遇到分隔符时就把收集到的数字转成整数存入数组:
#include<iostream> #include<sstream> #include<vector> #include<cctype> using namespace std; int main() { string str = "[[1,4], [5,7], [4,1], [8,9]]"; vector<vector<int>> vec; vector<int> current_subvec; string num_buffer; for (char c : str) { // 收集数字字符(支持负数的情况) if (isdigit(c) || (c == '-' && num_buffer.empty())) { num_buffer += c; } // 遇到逗号或右括号,说明当前数字结束 else if (c == ',' || c == ']') { if (!num_buffer.empty()) { current_subvec.push_back(stoi(num_buffer)); num_buffer.clear(); } // 遇到右括号,代表当前子数组完成 if (c == ']' && !current_subvec.empty()) { vec.push_back(current_subvec); current_subvec.clear(); } } // 其他字符([、空格)直接跳过 } // 验证输出 for (auto& subvec : vec) { cout << "vec[" << &subvec - &vec[0] << "] = {" << subvec[0] << ", " << subvec[1] << "}" << endl; } return 0; }
解决方案2:用stringstream配合符号跳过
利用stringstream的>>操作会自动跳过空白符的特性,主动跳过那些干扰符号,直接读取数字:
#include<iostream> #include<sstream> #include<vector> using namespace std; int main() { string str = "[[1,4], [5,7], [4,1], [8,9]]"; stringstream ss(str); vector<vector<int>> vec; char dummy; // 用来存储跳过的符号 // 跳过最外层的第一个[ ss >> dummy; while (ss >> dummy) { if (dummy == '[') { vector<int> subvec; int num; // 读取子数组内的数字,直到遇到] while (ss >> num) { subvec.push_back(num); ss >> dummy; // 跳过逗号或] if (dummy == ']') break; } vec.push_back(subvec); // 跳过子数组后面的逗号和空格(如果存在) ss >> dummy; } } // 验证输出 for (size_t i = 0; i < vec.size(); ++i) { cout << "vec[" << i << "] = {" << vec[i][0] << ", " << vec[i][1] << "}" << endl; } return 0; }
两种方法都能实现你想要的效果,运行后就能得到vec[0]={1,4}、vec[1]={5,7}这样的二维vector了。
内容的提问来源于stack exchange,提问作者Levi
相关产品推荐
相关产品推荐

