从字符串C ++的向量中替换字符串

时间:2017-06-17 04:05:47

标签: c++ algorithm replace

我有一个使用以下构造的字符串向量:

vector<string> names;
names.push_back("Gates");
names.push_back("Jones");
names.push_back("Smith");
names.push_back("Gates");

我想取代&#34; Gates&#34; &#34;比尔&#34;,每次出现&#34;盖茨&#34;。 为此,我所知道的最简单的解决方案是使用算法中的替换函数并将其用作:

replace(names.begin(), names.end(), "Gates", "Bill");

但我收到以下错误:

 parameter type mismatch:incompatible types 'const char (&)[6]' and 'const char[5]'. 

我可以使用隐式类型转换来解决它:

replace(names.begin(), names.end(), "Gates", (const char (&)[6]) "Bill");

任何人都可以解释这个错误是什么,以及解决它的更好方法或更好的方法。或者为什么我们需要这种类型的铸造。

2 个答案:

答案 0 :(得分:5)

std::replace中的旧/新值参数共享相同的类型。

例如,该函数可能如下所示:

template<class ForwardIt, class T>
void replace(ForwardIt first, ForwardIt last, const T& old_value, const T& new_value);

Stolen from here,而不是那么重要。

"gates"const char[6]billconst char[5],这就是您收到无法转换错误的原因。

您可以在std::string()中包装每个字符串文字,或者只使用一元+运算符将每个字面值衰减为const char*

replace(names.begin(), names.end(), +"Gates", +"Bill"); //shorter
replace(names.begin(), names.end(), std::string("Gates"), std::string("Bill")); //clearer

我非常确定((const char (&)[6]) "Bill")违反了严格的别名,所以我要避免在这种数组类型之间进行投射。

答案 1 :(得分:2)

我建议(假设一些using std;

 replace(names.begin(), names.end(), string{"Gates"}, string{"Bill"});

因为"Gates"的类型为char[6](已衰为char*),您想要替换std::string - s(不是char* !!)。