【问题标题】:no matching function for call to 'std::vector >::push_back(char&)'没有匹配函数调用 'std::vector >::push_back(char&)'
【发布时间】:2024-01-20 05:34:01
【问题描述】:

我已经声明了一个字符串向量和一个带有一些值的字符串变量。当我试图将字符串变量的每个字符推回字符串向量时。我收到一个错误。 如果我将字符串向量更改为 char 向量,则代码可以正常工作。

为什么在 push_back() 方法中字符串向量不接受字符?

#include<iostream>
#include<vector>

int main() {
    vector<string> vec;
    string s = "hello";
    int len = vec.size();
    for(int i=0; i<len; i++) {
        vec.push_back(s[i]);
    }
}

错误:没有匹配函数调用 'std::vector >::push_back(char&)'

Fix: vector<char> vec;

【问题讨论】:

  • 没有std::string 构造函数可以接受一个char。你想达到什么目的?
  • vec.push_back(s[i)); 括号未匹配。我认为您没有发布生成错误的代码。还缺少头文件&lt;string&gt;.
  • 我正在尝试使用 vector.push_back() 方法从字符串变量中逐个字符地填充向量。
  • @Janet 将它们保留在std::string 有什么问题?通常std::string 是单个字符的最佳容器。如果不是这样,为什么不std::vector&lt;char&gt;
  • @RichardCritten 感谢指出错字,我没有导入字符串,但即使导入后错误仍然存​​在。

标签: c++ string vector stl char


【解决方案1】:

错误是因为你不能这样做:

std::string('a');

或者这个:

string s = "hello";
std::string(s[0]);

std::string 没有任何构造函数可以接受单个 char


有 3 个选项:

将您的数据保存在std::string

最简单的。 std::string 是一个与std::vector 非常相似的容器,只是它只存储char 类型。

使用std::vector&lt;char&gt;

如果您需要向量而不是字符串,则使用单个字符的向量而不是 1-char-long-strings 的向量更为合理。
您可以使用

对其进行初始化
std::vector<char> vec(s.begin(), s.end())

或者就像你在尝试中所做的那样:

std::vector<char> vec;
std::string s = "hello";
for(int i=0; i<s.length(); i++) {
    vec.push_back(s[i]);
}

使用std::vector&lt;std::string&gt;

如果你真的需要使用字符串向量,你需要使用正确的std::string构造函数

std::vector<std::string> vec;
std::string s = "hello";
for(int i=0; i< s.length(); i++) {
    vec.push_back(std::string(1, s[i]));
}

或者用std::vector::emplace_back()更简洁一点

std::vector<std::string> vec;
std::string s = "hello";
for(int i=0; i< s.length(); i++) {
    vec.emplace_back(1, s[i]);
}

【讨论】: