C++ 如何将 char 转成 std::string 并存入 vector?
结论
example[index] 的类型是 char,而 std::vector<std::string> 的元素类型是 std::string。可以先用这个字符构造一个长度为 1 的字符串,再加入 vector:
list.push_back(std::string(1, example[index]));
这里假设 index 指向 example 中已有的字符。
原代码为什么不能编译?
如果你想在计算器中先把一个字符存入 vector,再向同一个元素追加字符,可以使用 std::vector<std::string>。原代码的问题在于传给 push_back 的参数:
list.push_back(example[index]);
这段代码中:
example是一个std::string。example[index]取得一个字符,表达式类型是char,返回字符引用。list.push_back(...)需要一个std::string元素。
std::string 没有只接收一个 char 的构造函数,所以这里无法自动完成转换。
可以通过指定字符数量和字符来构造字符串:
std::string(1, example[index])
第一个参数 1 表示字符的重复次数,第二个参数是要放入字符串的字符。例如,std::string(1, '7') 得到字符串 "7"。
完整示例
下面的代码读取输入,将第一个字符存入 vector。如果还有第二个字符,就把它追加到同一个元素中:
#include <iostream>
#include <string>
#include <vector>
int main() {
std::string example;
if (!(std::cin >> example)) {
return 0;
}
std::vector<std::string> list;
list.push_back(std::string(1, example[0]));
if (example.size() > 1) {
list[0].push_back(example[1]);
}
std::cout << list[0] << '\n';
return 0;
}
例如,输入 12 时,第一个元素先是 "1",追加第二个字符后变成 "12"。
新增元素和追加字符有什么区别?
这两个操作调用不同对象的 push_back:
// 给 vector 新增一个字符串元素。
list.push_back(std::string(1, '3'));
// 给 vector 中最后一个字符串追加字符。
list.back().push_back('4');
执行后,刚新增的元素是 "34"。也可以用 += 向字符串追加字符:
list.back() += '5';
该元素随后变成 "345"。调用 list.back() 前,必须确保 vector 中已经有元素。
如果使用 C++11 或更新标准,也可以直接在 vector 内构造字符串:
list.emplace_back(1, example[index]);
这两个参数会传给 std::string 的构造函数。
注意索引和输入方式
访问实际字符时,索引必须满足 0 <= index < example.size()。如果不能确定索引是否有效,可以使用 example.at(index);越界时它会抛出 std::out_of_range 异常。
std::cin >> example 遇到空白就会结束本次字符串读取。如果计算器需要读取包含空格的整行表达式,可以使用 std::getline(std::cin, example),并在访问字符前检查字符串是否为空。
备注:内容仅供参考。
