#include <iostream> //string 只要有iostream就可以用string了

using namespace std;

int main(){
    // 初始化字符串方式
    string s1;// 默认的空字符串
    string s2 = s1;//可以动态 s2是s1的一个副本 
    string s3 = "hiya";//s3是该字符串字面值的一个副本
    string s4(10, 'c');//s4的内容是:cccccccccccccc扎不多的了 总之就是10个c
    
    
    // string读入
    cin >> s1 >> s2;
    // string不可以用scanf读入
    cout << s1 << ' ' << s2 << endl;
    // 但是输出可以用printf输出
    // printf("%s\n", s1.c_str()) //,c_str()是一个方法返回值是字符数组地址
    // 也可以用puts(s1.c_str())
    
    
    
    // string 函数
    
    // empty() 指这个string是否是空的 空的返回true 不是则返回false
    
    cout << s1.empty() << endl;
    cout << s1.size() << endl;//size函数可以返回字符串长度和strlen一样 但是他的里面专门存了一个数 时间复杂度是01的是非常快的
    //s.length()和size一样 完全等价
    
    //string可以直接用运算符
    
    // string的加法必须其中有一个string字符串
    // string s3 = "hello" + "!";//这样是不行的
    // string s3 = s2 + "!"//这样是可以的 当s2是string的时候
    //此时s2是string
    
    
    //string 可以当成字符数组进行循环
    string s = "Hello World!";
    
    for(int i = 0; i < s.size(); i++)
        cout << s[i] << endl;
        
    //当想遍历某一个string的时候也可以这么写
    for(char c : s) cout << c << endl;//这个叫c++的范围遍历 前面的char值指字符数组里每一个字符的类型 c指遍历每一个元素的变量 s指字符串 c会顺次遍历 也就是正顺序遍历s中的每一个元素变量
    
    // for(x:y)是c++ 11标准中推出的
    
    // for(char c : s)//想要改变里面c的值
    // {
    //     c = 'a';
    // }//这样是没有效果的 因为上面那个char c 和下面c不是一个东西
    
    for(char &c : s)//可以这样加个引入地址符号强行把两个绑定起来 这样上面那个c就可以和下面的绑定起来了 即一个会变另外一个也会变
    {
        c = 'a';
    }
    
    // auto a = "hello world"//这个auto可以让编译器去猜他是什么类型的
    
    cout << s << endl;
    
    return 0;
}