C++ 字符串不变

C++ 字符串不变,c++,string,c++11,C++,String,C++11,** 当我运行大代码的这一部分时,它会打印出来 我把:A变成了:A 我把:A变成了:A 我已将:C变成:C 我已将:G变成:G 我已将:G变成:G 我把:T变成了:U 我把:T变成了:U 在这里: 它不会返回a的值 **将a+=seq[i]改为a[i]=seq[i],当然a+='U'改为 问题是a[i]不能成为a的一部分,因为a是空的 在循环中设置[i]时,a[i]表示编译器的不同变量。将a+=seq[i]改为a[i]=seq[i],当然a+=U'改为 问题是a[i]不能成为a的一部分,因为a是

**

当我运行大代码的这一部分时,它会打印出来 我把:A变成了:A 我把:A变成了:A 我已将:C变成:C 我已将:G变成:G 我已将:G变成:G 我把:T变成了:U 我把:T变成了:U 在这里: 它不会返回a的值

**将a+=seq[i]改为a[i]=seq[i],当然a+='U'改为 问题是a[i]不能成为a的一部分,因为a是空的 在循环中设置[i]时,a[i]表示编译器的不同变量。

将a+=seq[i]改为a[i]=seq[i],当然a+=U'改为 问题是a[i]不能成为a的一部分,因为a是空的
当您在循环中设置[i]时,[i]代表编译器的不同变量。

因为您没有设置字符串a的大小,它只保留了实现的小字符串优化所提供的空间。但请注意,即使如此,在初始化字符串之前对其进行索引也是未定义的行为

您可以通过设置一个类似的对象的大小来解决此问题:


因为您没有设置字符串a的大小,所以它只保留了实现的小字符串优化所提供的空间。但请注意,即使如此,在初始化字符串之前对其进行索引也是未定义的行为

您可以通过设置一个类似的对象的大小来解决此问题:

索引运算符[]不向a追加任何内容,它只能让您访问a中的现有字符。由于a中没有字符,所以在a中使用[]的每个行为都是未定义的行为

要将某个内容实际附加到a,可以使用a.append'U';或者a+='U'

另一种方法是将初始化为seq的副本,而不是空字符串。然后,您可以安全地在其上使用index操作符,因为您现在正在尝试

您可能还想考虑描述的替换函数。< /P> < P>索引运算符[]不向AB追加任何东西,它只允许您访问A中的现有字符。由于a中没有字符,所以在a中使用[]的每个行为都是未定义的行为

要将某个内容实际附加到a,可以使用a.append'U';或者a+='U'

另一种方法是将初始化为seq的副本,而不是空字符串。然后,您可以安全地在其上使用index操作符,因为您现在正在尝试

您也可以考虑描述的替换函数。在代码中,

由下面的默认构造函数创建。 例如,n3337draft 21.4.2中的表63表示

因此,代码中的[i]可以显示一些未定义的行为

我认为替换特定字符最简单的方法是使用std::replace,如下所示

在代码中,由以下默认构造函数创建。 例如,n3337draft 21.4.2中的表63表示

因此,代码中的[i]可以显示一些未定义的行为

我认为替换特定字符最简单的方法是使用std::replace,如下所示


a是空的。你不能仅仅在它的边界之外索引它。与其使用[],不如用a.ati='U'替换;和a.ati=seq[i];。然后你会看到你所犯的错误。a是空的。你不能仅仅在它的边界之外索引它。与其使用[],不如用a.ati='U'替换;和a.ati=seq[i];。然后你会看到你所犯的错误。更一般地说,如果i大于或等于a.length,a[i]就不是a的一部分。你是对的,当a为空时,没有索引是有效的;a、 length为0,因此没有大于或等于a.length的索引值。更一般地说,如果i大于或等于a.length,则a[i]不是a的一部分。你是对的,当a为空时,没有索引是有效的;a、 length是0,所以没有大于或等于a.length的索引值。显然,他的程序没有崩溃。否则,我相信他会注意到的。崩溃只是在未定义行为的情况下可能发生的无数行为之一。啊,你说得对。。。我看错了,以为最后一场戏根本没有发生。。。事实上,它只是将变量打印为空,因为它的大小为零。显然,他的程序没有崩溃。否则,我相信他会注意到的。崩溃只是在未定义行为的情况下可能发生的无数行为之一。啊,你说得对。。。我看错了,以为最后一场戏根本没有发生。。。实际上,它只是将变量打印为空,因为它的大小为零。
string a;
string seq="AACCGGTT";

for (int i=0;i<seq.length();i++)
{
    if (seq[i]=='T')
    {
        a[i]='U';
        cout<<"i have turned: "<<seq[i]<<" into : "<<a[i]<<endl;
    }
    else
    {
        a[i]=seq[i];
        cout<<"i have turned: "<<seq[i]<<" into : "<<a[i]<<endl;
    }
}

cout<<"here: "<<a<<endl;
string seq="AACCGGTT";
string a;
a.resize(seq.size();
explicit basic_string(const Allocator& a = Allocator());

data(): a non-null pointer that is copyable and can have 0 added to it
size(): 0
capacity(): an unspecified value
#include <iostream>
#include <string>
#include <algorithm>

int main()
{    
    std::string seq="AACCGGTT";
    std::replace(seq.begin(), seq.end(), 'T', 'U');
    
    std::cout << seq << std::endl; // "AACCGGUU"
    
    return 0;
}