我有一个使用以下构造的字符串向量:
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");
任何人都可以解释这个错误是什么,以及解决它的更好方法或更好的方法。或者为什么我们需要这种类型的铸造。
答案 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]
但bill
是const 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*
!!)。