C++ STL容器之string容器快速入门

发布于 2020-02-08  243 次阅读


C语言中一般用字符数组char str[]存放字符串,但使用字符数组有时会显得操作麻烦。C++在STL中加入了string类型,对字符串常用的需求功能进行封装,使得操作更加方便,且不易出错。

使用string需于代码头部添加#include<string>,并且随后加上一句:using namespace std;即可。

string的定义

仅定义:string str;
定义并初始化:string str = "abcd";

string容器内元素的访问

通过下标访问(直接像字符数组那样去访问string即可)

通过迭代器(类似指针)访问

在有些函数如insert()和erase()则要求迭代器为参数,因此容器此时需要通过迭代器访问。

定义:string::iterator it;

代码:

#include<stdio.h>
#include<string>
using namespace std;
int main(){
    //通过下标访问元素(一次读入输出单个字符)
    string str1 = "abcd";
    for(int i = 0; i < str.length(); i++){
        printf("%c",str[i]);//输出"abcd"
    }
    //通过下标访问元素(一次读入输出整个字符串)
    string str2;
    cin>>str2;
    cout<<str2;
    //通过下标访问元素(一次读入输出整个字符串)
    //用c_str()将string类型转换为字符数组进行输出
    printf("%s\n",str1.c_str());
    //通过迭代器访问
    for(string::iterator it = str.begin();it != str.end(); it++){
        printf("%c",*it);
        //只有vector和string中,才允许使用迭代器加上整数这种写法,如str.begin()+3
    }

    //拼接字符串
    string str4 = "abc", str5;
    str5 = str1 + str4;
    str1 += str4;//将str4拼接到str1上
    cout<<str5<<endl;//输出"abcdabc"
    cout<<str1<<endl;//输出"abcdabc"

    //比较字符串
    //可以直接使用==、!=、<、<=、>、>=按字典序比较大小。
    if(str1 == str5) printf("ok\n");

    //返回字符串长度,时间复杂度为O(1)
    printf("%d %d\n",str5.length(), str5.size());

    //插入字符,时间复杂度为O(N)
    //insert(pos,string),在pos号位置插入字符串string
    str5.insert(3,str4);//往str[3]处插入abc,结果为"abcabcdabc"
    str5.insert(3,"abc");//同上

    //insert(it,it2,it3)
    //it为原字符串的欲插入位置,it2和it3为待插字符串的首尾迭代器,用来表示串[it2,it3)将插在it的位置上
    //在str5的3号位(即c和a之间)插入str4
    str5.insert(str.begin() + 3, str4.begin(), str4.end());//结果为"abcabcabcdabc"
    //insert(pos,string),在pos号位置插入字符串string

    //删除单个元素
    str5.erase(str5.begin() + 4);//参数为迭代器,删除4号位,即"b",此时str5为"abcacabcdabc"

    //删除一个区间内的所有元素
    //str.erase(first,last)
    //删除在[str5.begin()+2,str5.end()-1)内的元素,即"cacabcdab"
    str5.erase(str5.begin()+2,str5.end()-1);//此时str5为"abc"

    //str.erase(pos,length)
    str1.erase(3,2);//删除从3号位开始的2个字符,即"ab",此时str1为"abccd"

    //清空元素
    str5.clear();

    //返回子串:substr(pos,len),时间复杂度为O(len)
    cout<<str1.substr(1,3)<<endl;//返回1号位开始,长度为3的子串,即"bcc"

    //find函数失配时的返回值:string::npos(unsigned_int类型的最大值)
    if(string::npos == -1){
        cout<<"-1 is true"<<endl;
    }
    if(string::npos == 4294967295){
        cout<<"4294967295 is  also true"<<endl;
    }

    //查找子串:find(),时间复杂度为O(mn)
    string str6 = "Thank you for your smile.";
    string str7 = "you";
    string str8 = "our";
    if(str.find(str7) != string::npos){
        cout<<str6.find(str7)<<endl;
        //输出6,返回当str7是str6的子串时str7在str6首次出现的位置
    }
    if(str.find(str7,7) != string::npos){
        cout<<str6.find(str7,7)<<endl;
        //输出14,返回从str6的7号位开始匹配str7,str7在str6的7号位后首次出现的位置
    }
    if(str.find(str8) != string::npos){
        cout<<str6.find(str8)<<endl;
    }else{
        cout<<"There is no position!"<<endl;
        //输出"There is no position!"
    }

    //子串替换:replace(),时间复杂度为O(str.length())
    //str6.repalce(pos,len,str2)把str从pos号位开始、长度为len的子串替换为str2
    cout << str6.replace(14, 4, str8) << endl;
    //str.repalce(it1,it2,str2)把str的迭代器[it1,it2)范围的的子串替换为str2
    cout << str6.replace(str8.begin(), str8.begin()+2, str8) << endl;
}

本文标题:《C++ STL容器之string容器快速入门》

本文链接:https://wnag.com.cn/281.html

特别声明:除特别标注,本站文章均为原创,本站文章原则上禁止转载,如确实要转载,请电联:wangyeuuu@qq.com,尊重他人劳动成果,谢过~


正因为有要好好实现的梦想,所以今天也要好好加油。