Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在运算符重载中会发生自由错误?_C++_String_Operator Overloading_Iteration - Fatal编程技术网

C++ 为什么在运算符重载中会发生自由错误?

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类重载了运算符*,但在本例中:

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等效

条件必须是i 但是为什么不使用std::string的一些函数呢

std::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等效

条件必须是i 但是为什么不使用std::string的一些函数呢

std::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;应该会更好…里面有一些警察,是吗