如何将std::string转换为std::vector<std::vector<char>>并实现反向转换
嘿,这个需求很清晰,我来给你一步步实现字符串和二维字符向量之间的互相转换!
1. 把std::string转成std::vector<std::vector>
这里给你两种实现方式,按需选择:
方法一:用std::stringstream分割(推荐,简洁省心)
stringstream会自动帮你处理空格分割,不管是单个空格还是多个连续空格都能正确识别单词,非常适合大多数场景:
#include <iostream> #include <string> #include <vector> #include <sstream> std::vector<std::vector<char>> stringTo2DVector(const std::string& str) { std::vector<std::vector<char>> result; std::stringstream ss(str); std::string word; // 逐个读取分割后的单词 while (ss >> word) { // 把单词直接转成char的vector std::vector<char> charVec(word.begin(), word.end()); result.push_back(charVec); } return result; } // 测试一下 int main() { std::string str{"Lorem ipsum dolor sit amet"}; auto arr = stringTo2DVector(str); // 打印验证结果 for (const auto& vec : arr) { std::cout << "["; for (size_t i = 0; i < vec.size(); ++i) { std::cout << "'" << vec[i] << "'"; if (i != vec.size() - 1) std::cout << ", "; } std::cout << "]\n"; } return 0; }
方法二:手动遍历分割(适合需要精细控制的场景)
如果你需要处理特殊情况(比如保留连续空格对应的空向量),可以手动遍历字符串来实现:
std::vector<std::vector<char>> stringTo2DVectorManual(const std::string& str) { std::vector<std::vector<char>> result; std::vector<char> currentWord; for (char c : str) { if (c == ' ') { // 避免连续空格生成空的子vector,这里可以根据需求调整 if (!currentWord.empty()) { result.push_back(currentWord); currentWord.clear(); } } else { currentWord.push_back(c); } } // 别忘了处理最后一个单词(如果字符串不以空格结尾) if (!currentWord.empty()) { result.push_back(currentWord); } return result; }
2. 把std::vector<std::vector>转回std::string
这个就简单了,遍历每个子向量拼接成单词,再用空格连接起来就行,注意别在末尾多添空格:
std::string twoDVectorToString(const std::vector<std::vector<char>>& arr) { std::string result; for (size_t i = 0; i < arr.size(); ++i) { // 将子vector的字符拼接成单个单词 std::string word(arr[i].begin(), arr[i].end()); result += word; // 只有不是最后一个单词时才加空格 if (i != arr.size() - 1) { result += " "; } } return result; } // 测试还原功能 int main() { std::vector<std::vector<char>> arr{ {'L','o','r','e','m'}, {'i','p','s','u','m'} }; std::string str = twoDVectorToString(arr); std::cout << str << std::endl; // 输出:Lorem ipsum return 0; }
如果你的场景需要保留原字符串里的连续空格,那手动分割和还原的逻辑都要调整,比如遇到连续空格时添加空的子vector,还原时遇到空vector就加空格——不过一般按单词分割的场景,上面的代码完全够用啦!
内容的提问来源于stack exchange,提问作者Jasper1378
相关产品推荐
相关产品推荐

