C++ 为什么在运算符重载中会发生自由错误?
我为std::string类重载了运算符*,但在本例中:C++ 为什么在运算符重载中会发生自由错误?,c++,string,operator-overloading,iteration,C++,String,Operator Overloading,Iteration,我为std::string类重载了运算符*,但在本例中: std::string operator*(std::string a, unsigned b) //bad { unsigned old_length = a.length(); a.resize(a.length()*b); for(unsigned i = old_length ;i<a.length()*b; i++) a[i]=a[i%old_length]; return
std::string operator*(std::string a, unsigned b) //bad
{
unsigned old_length = a.length();
a.resize(a.length()*b);
for(unsigned i = old_length ;i<a.length()*b; i++)
a[i]=a[i%old_length];
return a;
}
在a.length*b之前不能再次迭代,因为它在调整大小后与旧的_length*b*b等效
条件必须是istd::string operator*(std::string a, unsigned b)
{
a.reserve(a.length() * b);
for(unsigned i = 1 ; i <= b; i++)
a += a.substr(0, a.length() / b);
return a;
}
我们还有效地消除了在性能方面效果不佳的旧长度变量,请参见下面评论中的更好方法。您不能再次迭代到a.length*b,因为它在调整大小后与旧长度*b*b等效
条件必须是istd::string operator*(std::string a, unsigned b)
{
a.reserve(a.length() * b);
for(unsigned i = 1 ; i <= b; i++)
a += a.substr(0, a.length() / b);
return a;
}
我们还有效地消除了在性能方面不太有效的旧长度变量,请参见下面评论中的更好方法。一旦您执行a.resizea.length*b
a、 长度改变了
您的循环应该比
for(unsigned i = old_length ;i<a.length(); i++)
一旦你做了a.resizea.length*b
a、 长度改变了
您的循环应该比
for(unsigned i = old_length ;i<a.length(); i++)
自动n=a.长度;a、 保留*b;whileb-a.appenda,0,n;返回a;应该更好…有一些常数在里面,yeahauto n=a.length;a、 保留*b;whileb-a.appenda,0,n;返回a;应该会更好…里面有一些警察,是吗