• 【C++】string类的使用



    需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。


     目录

    一、string

    1、string的介绍

    2、为什么string类要实现为模板?

    二、元素访问

    1、使用operator[]实现数组下标式的访问

    2、迭代器读写

    2.1正向迭代器

    2.2反向迭代器

    2.3const正向迭代器(不能改变*it)

    2.4const反向迭代器(不能改变*it)

    3、范围for读写

    三、string的构造接口

    四、string的容量相关的接口

    1.reserve(调整容量)

    2.resize(调整size)

    五、string对象修改相关的接口

    1、insert

    2、earse

    3、assign

    4、replace

    六、string对象字符串运算相关接口

    1、c_str

    2、find查找+substr返回子串

    七、部分非成员函数接口

    1、getline

    八、string对象与其他类型互相转换

    1、stoi等

    2、to_string


    一、string

    1、string的介绍

    string是管理字符数组的类。

    typedef basic_string<char> string;

    basic_string是模板。将basic_string这个实例重命名为string。

    2、为什么string类要实现为模板?

    我们印象中,单个字符就是1个字节,也就是char类型,但是由于编码问题,会有2字节和4字节的字符类型。

    类型

    编码

    类型

    string

    UTF-8

    char

    wstring

    Unicode

    wchar_t

    u16string

    UTF-16

    char16_t

    u32string

    UTF-32

    char32_t

    对于字符串的多种类型,设计了basic_string模板。

    二、元素访问

    1、使用operator[]实现数组下标式的访问

    1. int main()
    2. {
    3. string s("hello world");//构造
    4. for (size_t i = 0; i < s.size(); ++i)//读
    5. {
    6. cout << s[i] << " ";//等价于cout << s.operator[](i) << " ";
    7. }
    8. cout<
    9. for (size_t i = 0; i < s.size(); ++i)//写
    10. {
    11. cout << (s[i] += 1) << " ";
    12. }
    13. return 0;
    14. }

    operator[]和at的区别在于operator[]是断言,at是抛异常。主要release版本assert失效。

    2、迭代器读写

    2.1正向迭代器

    1. int main()
    2. {
    3. string s("hello world");
    4. string::iterator it = s.begin();
    5. //遍历访问
    6. while (it != s.end())
    7. {
    8. cout << *it;
    9. ++it;
    10. }
    11. cout << endl;
    12. it = s.begin();//将it重新置为s.begin位置
    13. //遍历修改
    14. while (it != s.end())
    15. {
    16. *it += 1;
    17. cout << *it;
    18. ++it;
    19. }
    20. return 0;
    21. }

    2.2反向迭代器

    1. int main()
    2. {
    3. string s("hello world");
    4. string::reverse_iterator rit = s.rbegin();
    5. //遍历访问
    6. while (rit != s.rend())
    7. {
    8. cout << *rit;
    9. ++rit;
    10. }
    11. cout << endl;
    12. //遍历修改
    13. rit = s.rbegin();//将rit重新置为s.rbegin位置
    14. while (rit != s.rend())
    15. {
    16. *rit += 1;
    17. cout << *rit;
    18. ++rit;
    19. }
    20. return 0;
    21. }

    2.3const正向迭代器(不能改变*it)

    1. void test(const string& s)
    2. {
    3. string::const_iterator it = s.begin();
    4. while (it != s.end())
    5. {
    6. cout << *it;
    7. ++it;
    8. }
    9. }

    2.4const反向迭代器(不能改变*it)

    1. void test(const string& s)
    2. {
    3. string::const_reverse_iterator rit = s.rbegin();
    4. while (rit != s.rend())
    5. {
    6. cout << *rit;
    7. ++rit;
    8. }
    9. }

    3、范围for读写

    1. int main()
    2. {
    3. string s("hello world");
    4. //范围for的遍历访问
    5. for (auto e : s)
    6. {
    7. cout << e;
    8. }
    9. cout << endl;
    10. //范围for的遍历修改
    11. for (auto& e : s)
    12. {
    13. e += 1;
    14. cout << e;
    15. }
    16. return 0;
    17. }

    三、string的构造接口

    函数名称

    功能说明

    string() (重点)

    无参的构造,构造空字符串

    string(const char* s) (重点)

    用C_string字符串构造对象

    string(size_t n, char c)

    用n个字符创建对象

    string(const string& s) (重点)

    拷贝构造

    string (const string& str, size_t pos, size_t len = npos)

    用对象构造,下标为2至len位置

    string (const char* s, size_t n)

    用字符串的前n个构造对象

    template

    string (InputIterator first, InputIterator last);

    迭代器区间构造

    1. int main()
    2. {
    3. string s1;//无参的构造
    4. string s2("hello world");//用C_string字符串构造对象
    5. string s3(3, 'x');//用3个字符创建对象
    6. string s4(s2);//拷贝构造
    7. string s5(s2, 2, 7);//用s2对象构造,下标为2开始,共7个字符构造s5,结果为llo wor
    8. string s6("hello world", 7);//用字符串构前7个字符构造
    9. string s7(s2.begin(),s2.begin()+3);//迭代器区间构造
    10. return 0;
    11. }

    四、string的容量相关的接口

    函数名称

    功能说明

    size(重点)

    返回字符串的长度,不包含'\0'

    length

    返回字符串的长度,不包含'\0'

    capacity

    返回数组容量

    empty(重点)

    字符串的判空

    clear(重点)

    将size置为0,不改变容量

    reserve(重点)

    用于预先开好空间

    resize(重点)

    调整size的大小,可能会改变容量。多出来的位置用'\0'填充

    1.reserve(调整容量)

    reserve用于预先开好空间,如果预开空间小于现有空间,将不会改变容量。

    2.resize(调整size)

    1. int main()
    2. {
    3. string s("hello world");
    4. s.resize(20, 'x');//将size改为20,多出来的位置用字符x填充
    5. s.resize(30);//将size改为30,多出来的位置用'\0'填充
    6. return 0;
    7. }

    reserve和resize扩容时不会对已有的数据做改变,但缩容时会放弃超出空间的已有数据。

    五、string对象修改相关的接口

    函数名称

    功能说明

    push_back

    尾插一个字符

    append

    尾插字符串

    operator+=(重点)

    字符、字符串尾插

    insert

    在pos位置插入

    earse

    在pos位置删除

    assign

    对原有字符串清空后赋值

    replace

    替换

    1、insert

    1. string& insert (size_t pos, const string& str);//pos位置插入string对象
    2. string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);//pos位置插入字符对象的一部分
    3. string& insert (size_t pos, const char* s);//pos位置插入字符串
    4. string& insert (size_t pos, const char* s, size_t n);//pos位置插入字符串的前n个
    5. string& insert (size_t pos, size_t n, char c);//在pos位置插入n个字符
    6. void insert (iterator p, size_t n, char c);
    7. iterator insert (iterator p, char c);
    8. template <class InputIterator>
    9. void insert (iterator p, InputIterator first, InputIterator last);

    2、earse

    1. string& erase (size_t pos = 0, size_t len = npos); //从pos位置删除len个字符
    2. iterator erase (iterator p);
    3. iterator erase (iterator first, iterator last);

    3、assign

    assign可以理解成将原字符对象清空,重新进行赋值操作。

    4、replace

    repalce是对字符对象的部分取代。

    1. #include
    2. #include
    3. #include
    4. int main ()
    5. {
    6. std::string str ("The sixth sick sheik's sixth sheep's sick.");
    7. std::string key ("sixth");
    8. std::size_t found = str.rfind(key);
    9. if (found!=std::string::npos)
    10. str.replace (found,key.length(),"seventh");
    11. std::cout << str << '\n';
    12. return 0;
    13. }

    六、string对象字符串运算相关接口

    c_str(重点)

    将string对象返回c格式字符串的指针

    find(重点)

    查找

    rfind

    倒着找

    substr(重点)

    返回子串

    find_first_of

    返回第一个匹配字符的下标

    1、c_str

    1. int main()
    2. {
    3. string s("hello world");
    4. //虽然打印结果一样,但c_str()返回const char*,可以用于返回值有要求的地方
    5. cout << s << endl;
    6. cout << s.c_str() << endl;
    7. string file("test.txt");
    8. FILE* fout = fopen(file.c_str(), "w");
    9. return 0;
    10. }

    2、find查找+substr返回子串

    1. size_t find (const string& str, size_t pos = 0) const;//从pos位置开始,在string对象中找str
    2. size_t find (const char* s, size_t pos = 0) const;//从pos位置开始,在string对象中找s
    3. size_t find (const char* s, size_t pos, size_t n) const;//从pos位置开始,在string对象中匹配s的前n个
    4. size_t find (char c, size_t pos = 0) const;//从pos位置开始,在string对象中找字符

    rfind是找到字符最后一次出现位置的下标。

    一闭一开才是真实距离!!!

    查找.后边的内容:

    1. int main()
    2. {
    3. string file("test.txt");
    4. size_t pos = file.find('.');//size_t find (char c, size_t pos = 0) const;
    5. if (pos != string::npos)//npos是定义在string中的静态变量
    6. {
    7. string suffix = file.substr(pos,file.size()-pos);//这里长度不给也行,默认是npos
    8. cout << suffix << endl;
    9. }
    10. return 0;
    11. }

    查找协议:

    1. int main()
    2. {
    3. string url("https://legacy.cplusplus.com/reference/string/string/find/");
    4. size_t pos = url.find(':');
    5. if (pos != string::npos)
    6. {
    7. string protocol = url.substr(0, pos);//从0开始数pos个元素
    8. cout << protocol << endl;
    9. }
    10. return 0;
    11. }

    查找域名:

    1. int main()
    2. {
    3. string url("https://legacy.cplusplus.com/reference/string/string/find/");
    4. size_t pos1 = url.find(':');
    5. size_t pos2 = url.find('/', pos1 + 3);
    6. if (pos2 != string::npos)
    7. {
    8. string domainName = url.substr(pos1+3, pos2-pos1-3);
    9. cout << domainName << endl;
    10. }
    11. return 0;
    12. }

    查找地址:

    1. int main()
    2. {
    3. string url("https://legacy.cplusplus.com/reference/string/string/find/");
    4. size_t pos1 = url.find(':');
    5. size_t pos2 = url.find('/', pos1 + 3);
    6. string uri = url.substr(pos2+1);
    7. cout << uri << endl;
    8. return 0;
    9. }

    七、部分非成员函数接口

    函数名称

    功能说明

    operator+

    左右操作数必须有一个string对象或

    operator<<

    流插入

    operator>>

    流提取

    getline(重点)

    获取一行

    流提取是不能接收到空格和换行的,需要接收一行的时候需要使用getline。 

    1、getline

    1. istream& getline (istream& is, string& str, char delim);//从流提取中取出字符至str中,直至遇到delim或'\n'
    2. istream& getline (istream& is, string& str);//从流提取中取出字符至str中
    getline(std::cin,str);

    八、string对象与其他类型互相转换

    1、stoi等

     将一个string对象转化为int类型的数字。

    idx如果不传或者为nullptr,则表示不使用这个参数;反之,&idx指向string对象数字字符的后一个位置。

    2、to_string

    能够把内置类型转化为string对象。

  • 相关阅读:
    代码随想录算法训练营第六十天| LeetCode 739 每日温度、LeetCode 496 下一个更大元素 I
    【JavaScript】JavaScript基础篇
    计算机毕业设计之java+ssm家校通网站
    spring framework 5.2 文档 - 概述
    江西财经大学智慧江财登录分析
    搜题公众号搭建流程
    读《Gaitset: Regarding gait as a set for cross-view gait recognition》
    isa-l 中 ec_init_tables() 的用途
    秋招每日一题T17——行程排序
    metrics server request failed - “403 Forbidden“
  • 原文地址:https://blog.csdn.net/gfdxx/article/details/127760886