STL Push_back向量中的字符串
STL Push_back string in vector
我正在尝试在字符串向量中推送字符串,如下所示
void Node::set_val(string &val)
{
this->val.push_back(val);
}
但是当我尝试将其称为以下名称时
Obj.set_val("10h;");
我收到以下错误,
error: no matching function for call to 'Node::set_val(const char [5])'
我假设" "中的字符串与c ++中的字符串string
相同,为什么会出现这样的错误?下面需要更改什么?
您正在通过非常量引用来获取std::string
。非常量引用不能绑定到右值,如"10h;"
,因此不能将文字传递给该函数。
如果你不打算修改参数,你应该通过引用 const 来获取你的参数:
void Node::set_val(const string &val)
// ^^^^^
这样,将从您的const char[5]
构建一个临时std::string
并传递给set_val
。
您可以通过按值获取string
并将其move
到vector
中来改善这一点:
void Node::set_val(string val)
{
this->val.push_back(std::move(val));
}
这可以防止您制作一些不必要的副本。
因此,在C++中,const char* 可以隐式转换为 std::string,因为 std::string 有一个(非显式)构造函数,它采用 const char*。因此,编译器在这里尝试的是为您的函数调用创建一个临时的 std::string 对象,如下所示:
Node.set_val(std::string("10h;"));
但是,由于您将 set_val 参数声明为对 std::string 的非常量引用,因此编译器无法使此转换工作,因为临时对象不能绑定到非常量引用。
有三种方法可以完成此操作,具体取决于您要实现的目标:
void Node::set_val(const std::string& val) {}
void Node::set_val(std::string val) {}
void Node::set_val(std::string&& val) {}
所有这些都将编译(最后一个需要 C++11 或更高版本),但看到您的用例,我建议使用第二个或第三个。有关原因的解释,请尝试阅读 C++11 中的移动语义。
这里要带走的重要一点是,const char* 通过创建一个临时对象隐式转换为 std::string,并且临时对象不能传递给接受非 const 引用的函数。
您正在传递"10h;"
这是一个常量字符数组。
通过传递字符串来修复它:Obj.set_val(string("10h"));
和编辑函数以按值获取字符串:
void Node::set_val(string val) { /* */ }
或者更好的是,编辑您的函数以const string&
:
void Node::set_val(const string &val) { /* */ }
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- 在将字符串放入字符串向量时遇到问题?
- 如何从字符串向量构造对象并避免复制?
- 如何在目录及其子文件夹中构建文件名字符串向量?
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 将字符串向量中的字符串放入主字符串中
- 如何在 c++ 中从字符串向量中读取
- 用字符串的向量分配字符串向量
- 如何使用 STL 算法将整数向量转换为字符串向量?
- C++ 中字符串向量的索引
- 如何根据第二列/第三列等对字符串向量进行排序?
- 如何从输入中获取字符串向量?
- 使用 C++-17,如何从字符串向量填充元组
- 对于循环增量器不能用作字符串向量的索引
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 如何从字符串向量中选择第 n 个位置?
- 如何将csv中的数据放入c++中的字符串向量中,而绝对没有任何作用
- 反转不带反转函数的字符串向量
- 如何在字符串向量中指向const int
- 如何在字符串向量中找到某个值