C++STL(一)——string类

STL——string类

  • 初始化
  • string的赋值
  • string的连接
  • string的性质描述
  • 遍历
  • 字符指针和string的转化
  • 查找、替换、交换
  • 字符串的拼接
  • 区间删除、
  • 插入
  • 大小写转换
  • 比较
  • 反向排序
  • 字符串与数值类型的转化

初始化

    string s1 = "aaa";
    string s2("bbbb");//用字符串进行初始化
    string s3 = s2; //通过拷贝构造函数
    string s4 = (10,"A");//用同一个字符进行初始化

string的赋值

string &operator=(const string &s);//把字符串s赋给当前字符串
string &assign(const char *s);//用c类型字符串s赋值
string &assign(const char *s,int n);//用c字符串s开始的n个字符赋值
string &assign(const string &s);//把字符串s赋给当前字符串
string &assign(int n,char c);//用n个字符c赋值给当前字符串
string &assign(const string &s,int start,int n);//把字符串s中从start开始的n个字符赋给当前字符串
string &assign(const_iterator first,const_itertor last);//把first和last迭代器之间的部分赋给字符串

string的连接

string &operator+=(const string &s);//把字符串s连接到当前字符串的结尾 
string &append(const char *s);            //把c类型字符串s连接到当前字符串结尾
string &append(const char *s,int n);//把c类型字符串s的前n个字符连接到当前字符串结尾
string &append(const string &s);    //同operator+=()
string &append(const string &s,int pos,int n);//把字符串s中从pos开始的n个字符连接到当前字符串的结尾
string &append(int n,char c);        //在当前字符串结尾添加n个字符c
string &append(const_iterator first,const_iterator last);//把迭代器first和last之间的部分连接到当前字符串的结尾 

string的性质描述

string的特性描述:
int capacity()const;    //返回当前容量(即string中不必增加内存即可存放的元素个数)
int max_size()const;    //返回string对象中可存放的最大字符串的长度
int size()const;        //返回当前字符串的大小
int length()const;       //返回当前字符串的长度
bool empty()const;        //当前字符串是否为空,为空返回真值1,否则返回假值0
void resize(int len,char c);//把字符串当前大小置为len,并用字符c填充不足的部分

字符串的遍历

  • 1.用for 循环
    string a1="abcdefg";
    for(int i=0;i<a1.length();i++)
    {
        cout<<a1[i]<<" ";
        //用 string类函数at()进行访问cout<<a1.at[i];
        //at()函数会抛出异常
    }
  • 2.用迭代器
    for(string::iterator it=a1.begin();it<a1.end();it++)
        cout<<*it;

字符指针和string的转化

  • string转化为char * 类型
主要有三种方法可以将str转换为char*类型,分别是:data(); c_str(); copy();

1.data()方法,如:

1 string str = “hello”;
2 const char* p = str.data();//加const 3
3 char * p=(char*)str.data();// 强制转换
  同时有一点需要说明,这里在devc++中编译需要添加const,否则会报错invalid conversion from const char* to char ,这里可以再前面加上const或者在等号后面给强制转化成char的类型。

下面解释下该问题,const char是不能直接赋值到char,这样编译都不能通过,理由:假如可以的话,那么通过char就可以修改const char指向的内容了,这是不允许的。所以char要另外开辟新的空间,即上面的形式。

2.c_str()方法,如:

1 string str=“world”;
2 const char p = str.c_str();//同上,要加const或者等号右边用char
3.copy()方法,如:
  • char * 转string(可以直接赋值)
1 string s;
2 char *p = "hello";//直接赋值
3 s = p;
// 或者
string str(p); //利用构造函数完成赋值函数原型为 string str(char *);      

字符串的查找、替换和交换(使用类函数)

    //find函数原型,rfind ,find_firs_of  等的函数的参数列表与find()函数的相同
    /*
    find() 
    int find(char c, int pos = 0) const;//从pos开始查找字符c在当前字符串的位置
int find(const char *s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置
int find(const char *s, int pos, int n) const;//从pos开始查找字符串s中前n个字符在当前串中的位置
int find(const string &s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置
    rfind()
    find_first_of()
    find_last_of()
    find_first_not_of()
    find_last_not_of()
    */
    ⚠️注意:当find等函数寻找目标字符/字符串 成功返回所在位置,失败时返回string::npos的值。 

    string str4 = "who is the bast booy is very good aaaa!!!";
    //第一次出现 is 的位置(从零开始的位置)
    //从 往后查找
    int index = (int)str4.find("is",0);
    cout<<"index:"<< index <<endl;
    //从后往前找 用 rfind()函数 如果找不到返回值为-1(用法与 find相似)
    //应用 求is 出现的次数和位置
    int offindex =(int)str4.find("is",0);  //先从0号位置 开始进行查找
    while (offindex != string::npos) //npos= -1;
    {
        cout<<"offindex:"<<offindex<<endl;
        offindex = offindex + 1;
        offindex =(int) str4.find("is",offindex);
    }
    //深入应用 find 查找并 替换成 别的字符串,用replace(int pos,int len,char * s) // 删除从pos开始的len个字符,然后在pos插入字符串 s
    int pos =(int)str4.find("is",0);
    while(pos != string::npos)
    {
        str4.replace(pos,3,"IS");// 替换is用IS
        pos =(int)str4.find("is",pos+=1);
    }
    //replace()函数的简单应用
    string str5 = "aaa bbb ccc ";
    str5.replace(4,3,"BBB");
    cout<<str5;
    //字符串交换swap();
    string str_a = "abc";
    string str_b = "def";
    string str_c = str_a + str_b; //strc_c = "abcdef";
    str_a.swap(str_b);  //str_a = "abc",str_b = "def"; 

字符串的拼接

//+=,append(),push_back()在尾部添加字符
    string str_a = "abc";
    string str_b = "def";
    string str_c = str_a + str_b; //strc_c = "abcdef";
    str_a += str_b;  //str_a = "abcedf"
    str_a.append(str_c);  //str_a = "abcdefabcdef";
    str_b.push_back('z');  //把字符‘z’拼接到str_b 字符串的末尾

string字符串的插入和删除

    string ar1="BBBBCCCC";
    int position =(int) ar1.find("C",0);
    ar1.erase(position,3);  //从 pos位置开始删除3个字符
    cout<<ar1<<endl;
    string ar2 = "aaaaa ddddd eeee";
    ar2.erase(ar2.begin(),ar2.end()); //删除ar2中 一段区间的字符
    cout<<ar2.length()<<endl;
    string ar3 = "abcdefghi";
    string::iterator it = find(ar3.begin(),ar3.end(),'f');  //注意这里的find函数并非string内地类函数
    ar3.erase(it);  //删除 字符 f
    cout<<ar3<<endl;

插入字符串

    ar3.insert(2, "zzzz");  //注意这里的插入为在 2这个元素位置之前插入字符串
    cout<<ar3<<endl;
    ar3.insert(0, "1234567",5);  //在位置0 之前插入 ”1234567“ 字符串中的五个元素
    cout<<ar3<<endl;
    ar3.push_back('a') // push_back()只能 将 某个字符 插入的ar3的末尾 

string字符串大写或小写转换

    string s= "aaaaaBBBB";
    transform(s.begin(),s.end(),s.begin(),::toupper);
    cout<<s<<endl;
    transform(s.begin(),s.end(),s.begin(),::tolower);
    cout<<s<<endl;
    //在toupper/tolower前面加::,强制指定是C版本的(这时也不要include <cctype>了):

字符串比较

  • 1. 用 == > < >= <=等被重载的运算符进行比较
C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较(如 str<”hello”)。在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得 比较。字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。同时,string (“aaaa”) <string(aaaaa)
  • 2. 用compare()函数比较
//注:所谓“大”,是指字典序大(在字典中靠后)。
string s(“abcd”);
s.compare(“abcd”); //返回0
s.compare(“dcba”); //返回一个小于0的值
s.compare(“ab”); //返回大于0的值
s.compare(s); //相等
s.compare(0,2,s,2,2); //用”ab”和”cd”进行比较 小于零
s.compare(1,2,”bcx”,2); //用”bc”和”bc”比较。

字符串反向排序

    string str3 = "hellow world !";
    reverse(str3.begin(),str3.end());  //reverse(开始点,结束点);
    cout<<str3<<endl;

字符串与数值类型的转化

  • 字符串转化为数值型
    
    //1. int aoti(const char *) 转化为int类型将字符串,要使用 atoi 其参数类型为 char* 所必须在用之前 将 str4 用 c_str()转化为char *,以下同理
    string str4= "01234";
    int zhi_1 = atoi(str4.c_str());
    cout<<zhi_1<<endl;  //zhi_1 = 1234
    //2. long long aotl(const char *) 将字符串转化为长整型
    string str5 = "12345678910";
    long long int zhi_2 = atol(str5.c_str());  //zhi_2 = 12345678910
    cout<<zhi_2<<endl;
    //3. double atof(const char *);
    string str6 = "66.77";
    double zhi_3 = atof(str6.c_str());
    cout<<zhi_3<<endl; // zhi_3 == 66.77


  • 数值型转化为字符串
    // 数值转化为字符串
        //利用c++std名称空间的to_string()函数去完成
    /* to_string()函数原型
    string to_string (int val);
    string to_string (long val);
    string to_string (long long val);
    string to_string (unsigned val);
    string to_string (unsigned long val);
    string to_string (unsigned long long val);
    string to_string (float val);
    string to_string (double val);
    string to_string (long double val);
     */
    cout<<to_string(14.2)<<endl;  //实型->string:输出14.200000
    cout<<to_string(12301)<<endl; //整型->string:输出12301
    cout<<to_string(123456789785)<<endl;//长整型->string:输出123456789785
    cout<<to_string(true)<<endl;  //布尔型->string:输出1

发布了73 篇原创文章 · 获赞 100 · 访问量 2720

猜你喜欢

转载自blog.csdn.net/qq_34261446/article/details/103218233