将c样式字符串与c ++字符串混合时进行优化

时间:2014-06-23 03:45:55

标签: c++ c string optimization c-strings

我试图解决网站上的编程问题并且超出时限。现在我试图改变我的代码的某些部分,我将C ++字符串改为C样式字符串。

以下是我的代码中的一部分,我想要一些建议:

    x1 = X1 + X2 + X3;
    x2 = X1 + X3 + X2;
    x3 = X2 + X1 + X3;
    x4 = X2 + X3 + X1;
    x5 = X3 + X2 + X1;
    x6 = X3 + X1 + X2;

之前,以上所有变量都是C ++字符串,现在我已将大写字母变为C风格,因此这些分配不再有效......

初始化小写的最快方法是什么?

x1 = X1; 
x1 += X2; 
x1 += X3;

char buffer[20]; //would use x1 instead of a buffer if the answer to the second question 
                 //is to convert it(x1) to C-style
strcpy(buffer, X1); 
strcat(buffer, X2); 
strcat(buffer, X3); 
x1 = buffer;

小写的唯一用途是在这个比较中:

if(current == x1 || current == x2 || current == x3 || current == x4 || current == x5 || current == x6)

其中'当前'是C ++字符串(这个我不会改变,因为我通过容器内的元素更新它的值)

这个IF将被执行多次,所以我想知道让x1 ... x6作为C ++字符串是否更好(我想如果我将C ++字符串与C风格字符串进行比较,它将调用一个来自C ++字符串的构造函数,并在比较之前将C样式作为参数传递。

编辑:

重新制定:我想知道的第二个是:

当我做这样的比较时:

string st = "something";
char st2[20] = "other thing";
if(st == st2) 

是否要将构造函数字符串(st2)和比较构造的字符串调用到左边的字符串?让我说我做这个比较500000x,如果st2已经是C ++字符串会更快吗?

EDIT2:完整代码为here

1 个答案:

答案 0 :(得分:2)

如果你想要速度,不要为了进行比较而创建一个字符串;特别是,不要创建六个字符串,因为有时可能只需要其中一个或两个。它们是C字符串还是C ++字符串无关紧要。

您知道X1X2X3有多长?如果没有,它很容易找到。假设你这样做,你想知道的是:

if (   current.compare(0, lenX1, X1) == 0 &&
       (   current.compare(lenX1, lenX2, X2) == 0
           && current.compare(lenX1+lenX2, lenX3, X3) == 0 
        || current.compare(lenX1, lenX3, X3) == 0
           && current.compare(lenX1+lenX3, lenX2, X2) == 0)
    || current.compare(0, lenX2, X2) == 0 &&
       (   current.compare(lenX2, lenX1, X1) == 0
           && current.compare(lenX2+lenX1, lenX3, X3) == 0
        || current.compare(lenX2, lenX3, X3) == 0
           && current.compare(lenX2+lenX3, lenX1, X1) == 0)
    || current.compare(0, lenX3, X3) == 0 &&
       (   current.compare(lenX3, lenX1, X1) == 0
           && current.compare(lenX3+lenX1, lenX2, X2) == 0
        || current.compare(lenX3, lenX2, X2) == 0
           && current.compare(lenX3+lenX2, lenX1, X1) == 0))

当然,你的版本更具可读性,而我的版本可能会有拼写错误。

我怀疑这也是不必要的;你需要重新检查你的设计。为什么使用串联字符串而不是例如小整数元组?