C++中从括号分隔键值串取值:思路是否可行?改用Map更优?
问题解答
你的初步思路是否正确?
这个思路是可行的,但需要注意几个细节来避免bug:
- 搜索键的时候要带上
[和=,比如搜索[var1=而不是只搜var1,防止出现var12=xxx这类相似键的误匹配 - 要先判断键是否存在,以及后续的
]是否存在,避免因格式错误导致的越界问题
给你写个简单的C++实现示例:
#include <string> #include <iostream> std::string getValue(const std::string& str, const std::string& key) { std::string searchPattern = "[" + key + "="; size_t startIdx = str.find(searchPattern); if (startIdx == std::string::npos) { return ""; // 键不存在,返回空串或按需处理 } size_t valueStart = startIdx + searchPattern.size(); size_t endIdx = str.find("]", valueStart); if (endIdx == std::string::npos) { return ""; // 格式错误,未找到结束的] } return str.substr(valueStart, endIdx - valueStart); } int main() { std::string testStr = "[var1=x][var2=y][var3=z]"; std::cout << getValue(testStr, "var2") << std::endl; // 输出y return 0; }
是否改用Map存储更好?
这得看你的使用场景:
- 如果只需要单次查询某个键,直接解析字符串的方式更省内存,效率也足够
- 如果需要多次查询不同的键,把整个字符串解析到
std::unordered_map里更合适,后续查询都是O(1)的时间复杂度,不用每次都遍历字符串
解析到Map的示例代码:
#include <string> #include <unordered_map> #include <iostream> std::unordered_map<std::string, std::string> parseToMap(const std::string& str) { std::unordered_map<std::string, std::string> keyValueMap; size_t currentPos = 0; while (currentPos < str.size()) { size_t leftBracket = str.find("[", currentPos); if (leftBracket == std::string::npos) break; size_t equalSign = str.find("=", leftBracket); if (equalSign == std::string::npos) break; size_t rightBracket = str.find("]", equalSign); if (rightBracket == std::string::npos) break; std::string key = str.substr(leftBracket + 1, equalSign - leftBracket - 1); std::string value = str.substr(equalSign + 1, rightBracket - equalSign - 1); keyValueMap[key] = value; currentPos = rightBracket + 1; } return keyValueMap; } int main() { std::string testStr = "[var1=x][var2=y][var3=z]"; auto varMap = parseToMap(testStr); std::cout << varMap["var3"] << std::endl; // 输出z return 0; }
内容的提问来源于stack exchange,提问作者jinx ed
相关产品推荐
相关产品推荐

