• 序列式容器————string


    目录

    前言

    1、构造函数

    2、size()

    3、length()

    4、maxsize()

    5、capacity()

    6、reserve()

    7、resize()

    8、获取元素at()

    9、字符串比较compare()

    10、assign()

    11、operator=

    12、erase()

    13、swap()

    14、insert()

    15、append()

    16、replace()

    17、输入getline()

    18、查找函数

      find(),rfind()

      find_first_of() / find_last_of()

      find_first_not_of()函数和 find_last_not_of()函数

    19、迭代器

    20、配置器

    21、substr()


    不用担心内存、长度。

    #include <string>

    basic_string 是C++标准库中的字符串模板类。我们一般使用的string其实就是basic_string<char>, wstring是basic_string<wchar>

    string对象的元素是char型,string型对象可以直接和char型变量相加,得到string型对象。

    1、构造函数

    string str ("12345678");
    char ch[] = "abcdefgh";
        
    string a; //定义一个空字符串
        
    string str_1 (str); //构造函数,全部复制,12345678
        
    string str_2 (str, 2, 5); //构造函数,从字符串str的索引2开始,复制5个元素,赋值给str_2,即34567
        
    string str_3 (ch, 5); //将字符串ch的前5个元素赋值给str_3,即abcde
        
    string str_4 (5,'X'); //将 5 个 'X' 组成的字符串 "XXXXX" 赋值给 str_4
    
    string str_5 (10,42); //10个字符"*",就是10个asic码为42的字符
    
    string str_6 (str.begin(), str.end()); //复制字符串 str 的所有元素,并赋值给 str_6
    
    string str_7 (str.begin().str.begin()+7);//复制的是begin开始的7个元素,也就是区间(begin,begin+6)的元素

    2、string.size()

    获得字符串的长度

    3、string.length()

    获得字符串的长度

    4、string.max_size()

    返回 string 类型对象最多包含的字符数。一旦程序使用长度超过 max_size() 的 string 操作,编译器会拋出 length_error 异常。

    5、string.capacity()

    返回在重新分配内存之前,string 类型对象所能包含的最大字符数,每个string类型对象刚开始分配capacity个字符数,capacity的上限是max_size。

    6、string.reserve(num)

    为容器预留足够的空间,避免不必要的重复分配,影响capacity。

    7、string.resize(num)

    调整容器中有效数据区域的尺寸,如果尺寸变小,原来数据多余的截掉。若尺寸变大,不够的数据用该函数第二个参数填充,影响size。

    8、获取元素at()

    访问元素可以使用下标操作符[] 和 成员函数at()。两者均返回指定的下标位置的字符。

    下标操作符 [] 在使用时不检查索引的有效性,如果下标超出字符的长度范围,会示导致未定义行为。

    函数 at() 在使用时会检查下标是否有效。如果给定的下标超出字符的长度范围,系统会抛出 out_of_range 异常。

    9、字符串比较compare()

    字符串可以和类型相同的字符串相比较,也可以和具有同样字符类型的数组比较。返回一个整数来表示比较结果。如果相比较的两个子串相同,compare() 函数返回 0,否则返回非零值。

    int res = str1.compare(str2);
    int res = str1.compare(str1_pos,str1_len,str2)
    int res = str1.compare(str1_pos,str1_len,str2,str2_pos,str2_len)
    
    string A ("aBcdef");
    string B ("AbcdEf");
    string C ("123456");
    string D ("123dfg");
        
    //下面是各种比较方法
    int m=A.compare (B); //完整的A和B的比较
    int n=A.compare(1,5,B); //"Bcdef"和"AbcdEf"比较
    int p=A.compare(1,5,B,4,2); //"Bcdef"和"Ef"比较
    int q=C.compare(0,3,D,0,3); //"123"和"123"比较

    10、assign()

    string A ("aBcdef");
    string B ("AbcdEf");
    
    int res = str1.compare(str2);
    int res = str1.compare(str1_pos,str1_len,str2)
    int res = str1.compare(str1_pos,str1_len,str2,str2_pos,str2_len)
    
    //下面是各种比较方法
    int m=A.compare (B); //完整的A和B的比较
    int n=A.compare(1,5,B); //"Bcdef"和"AbcdEf"比较
    int p=A.compare(1,5,B,4,2); //"Bcdef"和"Ef"比较

    11、operator=

    符号“=”就是赋值

    12、erase()

    iterator erase(str.begin(),str.begin()+2);//删除begin开始的2个元素,也就是前两个元素吗,返回下一个元素的迭代器位置
    iterator erase(num);//只保留前num个元素
    
    str.erase(str.begin(),str.end());

    13、swap

    交换两个字符串的内容

    string str1("aaaaa");
    string str2("bbbbb");
    str1.swap(str2);//交换这个string变量的内容
    //此时str1:bbbbb
    // str2 : aaaaa

    14、insert()

    string insert(pos,n,char);//在pos位置插入n个char字符
    string str = "meihao";
    string sstr = str.insert(0,2,'a');//aameihao
    
    string insert(index,const CharT*);//index位置插入一个常量字符串
    string str = "meihao";
    string sstr = str.insert(1,"hello~");//mhello~eihao
    
    
    string insert(index,const string);//index位置插入常量string
    string str = "meihao";
    string sstr = str.insert(1,str);
    cout<<sstr<<endl;  //mmeihaoeihao
    
    string insert(index,const char*,n);//index位置插入常量字符串中的count个字符
    string str = "meihao";
    string sstr = str.insert(1,"hello~",3);
    cout<<sstr<<endl;  //mheleihao
    
    string insert(index,const string,index_str,count);index位置插入常量str的从index_str开始的count个字符
    string str1 = "meihao";
    string str2 = "hello~";
    string sstr = str2.insert(6,str1,3,3);
    cout<<sstr<<endl;  //hello~hao
    
    string insert(index,const string,index_str,string::npos);//index位置插入常量str从index_str开始的count个字符,count可以表示的最大值为npos.这个函数不构成重载
    string str1 = "meihao";
    string str2 = "hello~";
    string sstr = str2.insert(6,str1,3,string::npos);
    cout<<sstr<<endl;  //hello~hao
    cout<<string::npos<<endl;  //4294967295
    
    iterator insert(iterator pos,char);//pos位置之前插入一个字符char,返回迭代器
    string a("aaa");
    string::iterator it = a.insert(a.begin(),'a');
    cout<<a<<endl;//aaaa
    cout<<*it<<endl;//a
    
    void insert(iterator pos,count,char);//迭代器指向的pos位置插入count个字符ch
    string str1 = "meihao";
    str1.insert(++str1.begin(),2,'a');
    cout<<str1<<endl;  //maaeihao
    
    void insert( iterator pos, InputIt first, InputIt last );
    str1.insert(str1.end(),str2.begin(),str2.end());
    
    iterator insert( const_iterator pos, InputIt first, InputIt last );
    string str1 = "meihao";
    string str2 = "hello";
    //string::iterator it = str1.insert(str1.begin(),str2.begin(),str2.end());
    string::iterator it = str1.insert(str1.begin(),std::begin(str2),std::end(str2));
    cout<<str1<<endl;  //hellomeihao
    cout<<*it<<endl;  //h

    15、append()

    string a("aaa");
    string append(s);//在原始字符串后面追加字符串s
    string append(s,n);//在原始字符串后面追加字符串 s 的前 n 个字符
    string append(s,pos,n);//在原始字符串后面追加字符串s的字串,s的pos位置后的n个字符,即区间[pos,pos+n-1]
    string append(n,char);//追加 n 个重复字符
    string append(iterator first,iterator last);//使用迭代器追加,将字符串s的first到last的字符追加到string后面

    16、replace()

    字符串内容的替换。

    string& replace (size_t pos, size_t len, const string& str); //pos位置开始的len个字符替换为str
    
    string& replace (const_iterator i1, const_iterator i2, const string& str);//用str替换 迭代器起始位置 和 结束位置 的字符 
    
    string& replace (str_pos,str_len,s,s_pos,s_len);//将str的pos位置开始的str_len个字符替换为s的s_pos位置开始的s_len个字符

    17、输入getline()

    该函数可将整行的所有字符读到字符串中。在读取字符时,遇到文件结束符、分界符、回车符时,将终止读入操作,且文件结束符、分界符、回车符在字符串中不会保存;当已读入的字符数目超过字符串所能容纳的最大字符数时,将会终止读入操作。

    string str;
    getline(cin,str);
    getline(cin,str,' ');//第 1 个参数是输入流,第 2 个参数保存输入的字符串,第 3 个参数指定分界符

    18、查找函数

    查找 find() 函数和其他函数没有搜索到期望的字符(或子串),则返回 npos;若搜索成功,则返回搜索到的第 1 个字符或子串的位置。其中,npos 是一个无符号整数值,初始值为 -1。当搜索失败时, npos 表示“没有找到(not found)”或“所有剩佘字符”。

    (1)find()/rfind()

    find(char,pos);//在pos位置开始搜索char字符
    find(s,pos);//在pos位置搜索s字符串
    find(s,pos,n);//在pos位置搜索s字符串的前n个字符的子字符串

    rfind()适用于实现逆向查找。

    (2)find_first_of() / find_last_of()

    find_first_of() 函数可实现在源串中搜索某字符串的功能,该函数的返回值是被搜索字符串的第 1 个字符第 1 次出现的下标(位置)。若查找失败,则返回 npos。

    find_last_of() 函数同样可实现在源串中搜索某字符串的功能。与 find_first_of() 函数所不同的是,该函数的返回值是被搜索字符串的最后 1 个字符的下标(位置)。若查找失败,则返回 npos。

    (3)find_first_not_of()函数和 find_last_not_of()函数

    find_first_not_of() 函数可实现在源字符串中搜索与指定字符(串)不相等的第 1 个字符;find_last_not_of() 函数可实现在源字符串中搜索与指定字符(串)不相等的最后 1 个字符。这两个函数的参数意义和前面几个函数相同,它们的使用方法和前面几个函数也基本相同。

    19、迭代器

    STL 定义了 5 种迭代器,根据所需的迭代器类型对算法进行描述。这 5 种迭代器分别是:输入迭代器、输出迭代器、正向迭代器、双向迭代器和随机访问迭代器。

    对于这 5 种迭代器不仅可以执行解除引用操作(* 操作符),还可进行比较。本节主要讲述 basic_string(或 string 类)中迭代器的使用。

    string 类中和使用迭代器相关的成员函数是很多的,主要包括 begin()、end()、rbegin ()、rend()、append()、assign()、insert()、erase()、replace() 等。

    20、配置器

    配置器的作用就是为容器分配内存。

    所以使用内存配置器分配内存时,是按对象的个数进行的,而不是按字节数。

    21、substr()

    int main()
    {
      string s("abcdefghigklmn");
      string a = s.substr(0,5);     //获得字符串s中从第0位开始的长度为5的字符串
      cout << a << endl;
    }

    输出abcde

    s1 = s.sbustr(pos,n);

    返回一个string,从pos开始的n个字符拷贝到s1。

    pos默认0,n的默认值是s.size() - pos,如果pos+n超出了字符串长度,就只拷贝到s的末尾;

    若pos超过了字符串的长度,抛出异常

  • 相关阅读:
    在页面生命周期执行时 Page 对象在 SaveState 阶段都发生了什么事?
    接收Firfox RESTClient #Post请求
    c# 单例模式[Singleton]之深夜闲聊
    JQuery 之 Ajax 异步和同步浅谈
    [模板]数学整合
    Yandex插件使用说明——Slager_Z
    模板练习(LUOGU)
    数学整合 新(LUOGU)
    [NOI.AC]DELETE(LIS)
    [NOI.AC]COUNT(数学)
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11439825.html
Copyright © 2020-2023  润新知