#include <string>
#include <iostream>

int main()
{
    using std::cin;
    using std::cout;
    using std::endl;
    using std::string;

    //string初始化,
    //    使用等号(=), 执行拷贝初始化,
    //    不使用等号, 执行直接初始化.
    string s1          ; //空字符串
    string s2(s1)      ; //s2是s1的副本
    string s3("value") ; //直接初始化, s3是字面值"value"的副本
    string s4 = "value"; //拷贝初始化, 
    string s5(4, 'c')  ; //直接初始化, s5初始化为4个'c'组成的串: "ccccccccc"

    //string操作
    cout << "s3         : " << s3 << endl; //value, 整个字符串
    cout << "s3.empty() : " << s3.empty() << endl; //0, 判断字符串为空
    cout << "s3.size()  : " << s3.size() << endl ; //5, s3中字符数目
    cout << "s3[3]      : " << s3[3] << endl     ; //u, 返回第3字符的引用(从0开始)
    cout << "s3+s5      : " << s3+s5 << endl     ; //valuecccc, 连接字符串
    cout << "(s3==s4)   : " << (s3==s4) << endl  ; //1, 判断字符串相等

    //size_type: 无符号类型, 可以存放下任何string对象的大小(使用int可能溢出)
    string::size_type len0 = s4.size() ; //使用size_type存储string字符数目
    auto len1 = s5.size() ; //使用auto来推断变量类型

    //字面值与string对象相加, 要求两个运算对象至少有一个是string.
    string s6="hello", s7="world";
    string s8 = s6 + ", " + s7; //正确
    string s9 = s6 + ", "     ; //正确
    string s10= ", " + s7     ; //正确
    string s11= s6 + ", " + "world"; //正确, 从左向右结合
    //string s12= "hello" + ", "; //错误, 不能把两个字面值相加
    //string s13= "hello" + ", " + s7; //错误, 不能把两个字面值相加

    //遍历string
    cout << "loop string s6 by index: " << s6 << endl;
    for(string::size_type i=0; i<s6.size(); i++){ //使用index遍历string
        cout << "s6[" << i << "] : " << s6[i] << endl;
    }
    cout << "loop string s6 by new method: " << s6 << endl;
    for(auto c: s6){ //使用auto让编译器决定变量c的类型
        cout << c << endl;
    }

    //使用for改变string中的字符
    string s14 = "abcd";
    for(auto &c: s14){ //c是引用, 所以对c的修改会体现到s14中.
        c= toupper(c); //转为大写
    }
    cout << "s14 = " << s14 << endl; //s14 = ABCD

    return 0;
}