我需要更多空间吗?

时间:2011-11-15 06:40:25

标签: c++ xcode

我的代码应该将字符串分成3个长度部分:

  

ABCDEFG应为ABC DEF G

但是,我有一个非常长的字符串,我一直在

  

在没有活动异常的情况下终止被调用

当我缩短琴弦的长度时,它似乎有效。我需要更多空间吗?我想在使用字符串时我不必担心空间。

int main ()
{
    string code, default_Code, start_C;
    default_Code = "TCAATGTAACGCGCTACCCGGAGCTCTGGGCCCAAATTTCATCCACT";         
    start_C      = "AUG";

    code         = default_Code;

    for (double j = 0; j < code.length(); j++) {  //insert spacing here
        code.insert(j += 3, 1, ' ');
    }
    cout << code;

    return 0;
}

3 个答案:

答案 0 :(得分:2)

考虑code.length()== 2时的情况。你在字符串上的某处插入一个空格。我不确定,但如果for(int j=0; j+3 < code.length(); j++),那就没关系。

答案 1 :(得分:2)

这是一些相当混乱的代码。您循环遍历字符串并循环,直到到达字符串的末尾。但是,在循环内部,您不仅要修改循环的字符串,还要在j + = 3时更改循环变量。

它恰好适用于任意多个3个字母的字符串,但是您没有正确处理其他情况。

这是for循环的一个工作示例,它更清楚它正在做什么:

// We skip 4 each time because we added a space.
for (int j = 3; j < code.length(); j += 4) 
{
   code.insert(j, 1, ' ');
}

答案 2 :(得分:0)

您正在使用效率极低的方法来执行此类操作。每次插入空格时,您都会向前移动字符串的所有剩余部分,这意味着您需要的操作总数大约为o(n**2)

您可以使用读写方法通过单个o(n)传递执行此转换:

// input string is assumed to be non-empty
std::string new_string((old_string.size()*4-1)/3);
int writeptr = 0, count = 0;
for (int readptr=0,n=old_string.size(); readptr<n; readptr++) {
    new_string[writeptr++] = old_string[readptr];
    if (++count == 3) {
        count = 0;
        new_string[writeptr++] = ' ';
    }
}

类似的算法也可以编写为“inplace”而不是创建一个新的字符串,只需要先放大字符串然后再向后工作。

另请注意,虽然对于字符串而言您不需要关心分配和释放仍然存在对字符串对象大小的限制(即使您可能没有点击它们......您的版本是如此缓慢,以至于在现代计算机上达到这一点需要永远。)