我重载operator*
了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程序崩溃并出现错误:
***"./ program"中的错误:free():下一个大小无效(快):0x0000000000cd20b0***已中止
如果我像这样重载它 - 没有错误:
std::string operator*(std::string a, unsigned b) { unsigned old_length = a.length(); std::string a2 = a; a2.resize(a.length()*b); for(unsigned i = 0 ;i那问题出在哪里?有没有办法不创建新的字符串
a2
?它消耗额外的内存.#include#include std::string operator*(unsigned b, std::string a) { return operator*(a, b); } int main(int argc, char **argv) { std::string a = "abcdef "; // if string contains more than 4 symbols - free error for the first case std::string aaaa = 4*a; std::cout << a << "\n" << aaaa << "\n" << std::endl; return 0; }
LogicStuff.. 5
你不能
a.length() * b
再次迭代(因为它相当于old_length * b * b
调整大小后).条件必须是
i < a.length()
或i < old_length * b
.但为什么不使用一些
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; }我们还有效地消除了
old_length
变量(在性能方面不那么有效,请参阅下面的评论中更好的方法).
1> LogicStuff..:你不能
a.length() * b
再次迭代(因为它相当于old_length * b * b
调整大小后).条件必须是
i < a.length()
或i < old_length * b
.但为什么不使用一些
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; }我们还有效地消除了
old_length
变量(在性能方面不那么有效,请参阅下面的评论中更好的方法).
`auto n = a.length(); a.reserve(n*b); while(b--)a.append(a,0,n);返回a;`应该更好......