请大神帮帮忙。字符串类重载+来拼接2个字符串,怎么能有效率
请大神帮帮忙。字符串类重载+来拼接2个字符串,如何能有效率?
primer上的题目,改进一个
String类。重载+。
我写的是
String operator+(const String& c1, const String& c2){
int tlen = std::strlen(c1.str)+std::strlen(c2.str);
char* tmp = new char[tlen + 1];
strcpy(tmp, c1.str);
strcat(tmp, c2.str);
String tmpc(tmp);
delete[] tmp;
return tmpc;
}
感觉很没有效率。
事先假定char固定为char arr[160]可以。不过不喜欢这样子。不知道大神们有没有什么方法能改进?
------解决方案--------------------
String类没有提供常数时间的size()或length()方法吗?你的写法确实是低效的,没必要用那个中间过程,直接为目标类分配、写入。
假定String就是封装了一个char * 的指针,没有专门保存长度的变量--不存在常数时间访问的能力
这样效率就差不多了。
顺便说一下,如果编译器抱怨不认识move, 那是因为你该换编译器了。去down个免费的vc++2013 express. 建议再配上ultimate++的IDE, 以后转学GUI编程也驾轻就熟. 更可以跨平台到linux(当然,用的是g++)
primer上的题目,改进一个
String类。重载+。
我写的是
String operator+(const String& c1, const String& c2){
int tlen = std::strlen(c1.str)+std::strlen(c2.str);
char* tmp = new char[tlen + 1];
strcpy(tmp, c1.str);
strcat(tmp, c2.str);
String tmpc(tmp);
delete[] tmp;
return tmpc;
}
感觉很没有效率。
事先假定char固定为char arr[160]可以。不过不喜欢这样子。不知道大神们有没有什么方法能改进?
------解决方案--------------------
String类没有提供常数时间的size()或length()方法吗?你的写法确实是低效的,没必要用那个中间过程,直接为目标类分配、写入。
假定String就是封装了一个char * 的指针,没有专门保存长度的变量--不存在常数时间访问的能力
class String
{
public:
String():data(NULL){}
String(const String& s):data(NULL){
if(s.data){
data=new char[s.Length()+1];
memcpy(data,s.data,s.Length()+1);
}
}
String(String&& s):data(s.data){ s.data=NULL; }
~String(){ delete [] data; }
int Length()const{ return data?strlen(data):0; }
private:
char * data;
friend String operator+((const String& s1, const String& s2);
};
String operator+(const String& s1, const String& s2)
{
String s;
int s1len,s2len,newlen;
s1len=s1.Length();
s2len=s2.Length();
newlen=s1len+s2len;
if(newlen!=0)
{
s.data=new char[++newlen];
memcpy(s.data,s1.data, s1len);
memcpy(s.data+s1len, s2len+1);
}
return std::move(s);
}
这样效率就差不多了。
顺便说一下,如果编译器抱怨不认识move, 那是因为你该换编译器了。去down个免费的vc++2013 express. 建议再配上ultimate++的IDE, 以后转学GUI编程也驾轻就熟. 更可以跨平台到linux(当然,用的是g++)