STL学习-string

string 简介

string,是一个专门用于操作字符串的一个类,需包含头文件。注意与char*的区别,char*指向一块连续的内存,用于存放字符串,提供了字符串操作的一些方法,如strlen/strcmp等。

string 构造

简单介绍几种声明方式,如下:

void StrDefine() {
    string str1;
    cout << str1 << endl;//类对象(str1)是不能直接输出的,是因为string类中重载了运算符<<函数

    string str2(5, 'a');
    cout << str2 << endl;

    string str3("husong");
    cout << str3 << endl;

    string str4("husong", 2);
    cout << str4 << endl;

    string str5(str3, 2, 4);
    cout << str5 << endl;
}

string 属性

这里只简单介绍几个函数:capacity()/reserve()/empty()/length()/size()/resize()。见代码注释:

void StrCapacity() {

    string str1;
    cout << str1.capacity() << endl;// 输出15,系统默认为空string对象申请了15个字符对象空间


    string str2("husonghusonghusong");
    cout << str2.capacity() << endl;// 输出31,大于15个字符时,系统又多申请了16个空间,vs编译器规律:15+16+16...
                                    // vc编译器规律:31+32+32...

    string str3("husong");
    cout << str3.capacity() << endl;// 默认输出15
    str3.reserve(20);// 输出31
    str3.reserve(10);// 输出15,也就是说reserve()只能相对当前capacity大小扩大,不能缩小
                     //cout << str3.capacity() << endl;
}
void StrEmpty() {

    string str1;
    cout << str1.empty() << endl;// 输出1,当字符串为空,empty()返回true,否则返回false

    string str2("husong");
    cout << str2.empty() << endl;// 输出0
}
void StrLengthSize() {

    string str1("husong");
    cout << str1.size() << endl;// 输出6
    cout << str1.length() << endl;// 输出6

    string str2("哈哈哈哈");// 一个汉字占2个字节
    cout << str2.size() << endl;// 输出8
    cout << str2.length() << endl;// 输出8

    string str3("husong");
    str3.resize(2);// resize()作用与string对象,capacity不会变
    cout << str3 << endl;//输出hu
    cout << str3.length() << endl;// 输出2
    cout << str3.size() << endl;// 输出2
    cout<< str3.capacity() <

string 输出

对字符串无非是整串、子串、单个字符的使用。详见注释:

void StrCout() {

    string str1("husong");
    cout << str1 << endl;// 前面注释说过,实际上是string内部重载了运算符<<函数
    cout << str1.c_str() << endl;// c_str() 函数实际返回的是string类中的 char* 指针

    string str2(str1, 0, 2);
    cout << str2 << endl;// 输出子串
    
    cout << str1[1] << endl;// 输出单个字符,实际上也是重载了运算符[]函数
    cout << str1.at(2) << endl;
}

string 修改

见代码:

void StrChange() {

    string str1("husong");
    str1[1] = 's';
    cout << str1 << endl;

    str1.at(1) = 'y';
    cout << str1 << endl;

//若是修改其中某段子串,可利用循环修改
}
void StrInsert() {

    string str1("husong");

    string str2("zzzz");
    str2.insert(2, str1);// 在指定index前插入,第二个参数可以为指针或引用类型
    cout << str2 << endl;// 输出 zzhusongzz

    string str3("oooo");
    str3.insert(2, str1, 2, 4);// 在指定index前插入子串
    cout << str3 << endl;// 输出oosongoo

    string str4("iiii");
    str4.insert(1, str1, 4);
    cout << str4 << endl;// 输出ingii

    str1.insert(1, 5, 'm');// 在指定index前插入n个字符
    cout << str1 << endl;// 输出hmmmmmusong
}
void StrAppend() {

    string str1("Hello");

    string str2("World");
    str1.append(str2);// 尾部插入字符串,参数为指针或引用
    cout << str1 << endl;// 输出HelloWorld

    string str3("Hello");
    string str4("sssJamesssssss");// 尾部插入子串
    str3.append(str4, 3, 5);
    cout << str3 << endl;//输出HelloJames
    
    string str5("Hello");
    string str6("World");
    str5.append(str6, 2);// 尾部插入字符串的子串(指定位置到尾部)
    cout << str5 << endl;// 输出Hellorld

    string str7("Hello");
    str7.append(3, 'p');// 尾部插入n个字符
    cout << str7 << endl;// 输出Helloppp
}

string 比较

void StrCompare() {

    string str1("abcd");
    string str2("abc");
    string str3("abcd");
    string str4("sabcd");

    cout << str1.compare(str2) << endl;// 1
    cout << str2.compare(str1) << endl;// -1
    cout << str1.compare(str3) << endl;// 0
    cout << str4.compare(3, 3, str1) << endl;// -1
    cout << str4.compare(4, 2, str1, 1, 2) << endl;// 0
}

string 拷贝

void StrCopy() {

    string str1("husong");
    char str2[8] = {0};
    str1.copy(str2, 2, 9);// 参数1:目标字符数组  参数2:拷贝长度  参数3:起始index
                          // 这里会报错,原因是copy方法第3个参数可能会导致str2数组越界,不安全
                          // 解决方式:添加#pragma warning(disable:4996),预编译时不报4996错
    cout << str2 << endl;
}

string 查找和获取子串

void StrSubStr() {

    string str1("husong");
    string str2;
    str2 = str1.substr(2, 4);
    cout << str2 << endl;//输出song
}

void StrFind() {

    string str1("abcdefg");
    string str2("def");

    int index = 0;
    index = (int)str1.find(str2, 0);// 在str1中从0位置开始查找str2,如果找不到,转为int,结果为-1
    cout << index << endl;// 输出3
}

string 交换

void StrSwap() {

    string str1("ttttttttttt");
    string str2("uuuuuuuuuuu");

    str1.swap(str2);
    cout << str1 << " " << str2 << endl;
}

string 迭代器

迭代器其实就是一个指向容器元素的指针,可以通过容器的begin()/end()改变迭代器的指向,这里需注意迭代器失效的情况,见注释。

void StrIterator() {
    string str1("husong");
    string::iterator iter = str1.begin();
    for (iter; iter != str1.end(); ++iter) {
        cout << *iter << " ";
    }
    cout << endl;

    str1.append(15, 'm');// 这句代码,系统会重新分配31个字符空间(vs编译器),把原来的str1拷贝过来,但此时iter的指向并未改变
    iter = str1.begin();// 把iter指向新的内存首即可
    iter[1] = 'o';
    cout << str1 << endl;    
}

string 算法举例

void fun(char c) {
    cout << c <<" ";
}
void StrAlr() {
    string str1("husong");
    for_each(str1.begin(), str1.end(), fun);

    sort(str1.begin(), str1.end());// 默认从小到大排序    
    cout << endl;
    for_each(str1.begin(), str1.end(), fun);

    sort(str1.begin(), str1.end(), greater());//从大到小, greater()仿函数,需导入头文件
    cout << endl;
    for_each(str1.begin(), str1.end(), fun);
}

你可能感兴趣的:(string,stl)