请大神帮帮忙。字符串类重载+来拼接2个字符串,怎么能有效率

请大神帮帮忙。字符串类重载+来拼接2个字符串,如何能有效率?
本帖最后由 sasuke_seiya 于 2014-02-03 14:09:05 编辑
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++)