PAYATHON 2026

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),并在访问字符前检查字符串是否为空。

备注:内容仅供参考。