当前位置 博文首页 > Jude_Zhang:C++ string (浅谈)

    Jude_Zhang:C++ string (浅谈)

    作者:Jude_Zhang 时间:2021-02-07 22:24

    C++常用string知识点小结

    浅谈string

    <string>

    typedef basic_string<char> string;

    本篇主要内容是简单地介绍 string类 在竞赛方面较实用的一些功能,可能满足不了各大佬的需求

    还是采用查字典的形式,右边目录速览吧


    一、迭代器

    string可以被归为顺序容器,有着和其他容器一样的随机访问迭代器

    (1)、begin

    iterator begin();

    返回指向string的第一个字符的迭代器。

    (2)、end

    返回一个尾后迭代器,指向尾元素的下一个位置

    二、功能型函数

    (1)、size

    size_t size();

    返回字符串的长度,顺便提醒句,以字节为单位

    (2)、length

    与(1)完全相同

    (3)、clear

    将当前容器的所有内容清空

    (4)、empty

    bool empty();

    返回当前容器是否为空

    三、元素访问

    (1)、[]

    下标随机访问,它就是神!

    简单举例:源字符串每两个字母之间有一个空格,要求只单独输出字母

    #include <iostream>
    
    using namespace std;
    
    int main ( void )
    {
    	string a = "a b c d e f";
    
    	for ( int i = 0; i < a.size(); i += 2 )
    	{
    		cout << a[i];
    	}
    	cout << endl;
    	return 0;
    }
    

    看看这优美的下标访问,是不是有种可以立马抛弃传统的char数组的感觉了

    (2)、at

    和下标访问是一样的,只不过更加安全,如果超出范围,会返回out_of_range异常

    换成at输出以上程序:

    #include <iostream>
    
    using namespace std;
    
    int main ( void )
    {
    	string a = "a b c d e f";
    
    	for ( int i = 0; i < a.size(); i += 2 )
    	{
    		cout << a.at(i);
    	}
    	cout << endl;
    	return 0;
    }
    



    (3)、back

    char& back();

    返回对最后一个元素的引用,所以我们可以进行输出或重写操作

    如果string为空呢? 那此操作的行为是未定义的,否则不会抛出异常

    (4)、front

    返回对首元素的引用

    四、对string添加修改的一些操作

    (1)、+=

    这个就太牛了,可以在当前值的末尾附加其他字符或字符串来扩展字符串

    当然这意味着还有两种操作

    1、+

    s1 + s2

    返回s1s2连接后的结果

    还有一个,就是字面值也可以与string对象加起来,注意:一定要保证加号至少连接了一个string对象

    s1 + "hello"

    比如说!你不能写成以下这样!

    s1 + ( "hello" + ", world" )

    2、=

    s1 = s2

    s2的副本代替s1中原来的字符

    (2)、push_back

    void push_back (char c);

    c追加到字符串的末尾,并将其长度自增1

    (3)、pop_back

    void pop_back();

    删除string中的最后一个字符

    如果string中没有任何元素,则该行为所产生的结果未定义

    (4)、insert

    啊,到较为复杂的环节了,我尽力弄得清楚点、、

    参数类型 解释
    pos 在容器中插入新元素的位置,新元素将插入在position的前面 (从0开始)
    str 另一个string对象
    subpos str中的起始位置。(从0开始)
    sublen 要复制的子字符串的长度
    s 指向字符数组的指针(例如char数组)。
    c char类型的值
    p 一个指向插入点的迭代器,将新内容插入到p指向的字符之前。
    n 要插入的字符个数
    first, last 指定元素范围的迭代器,将 [first,last)范围内的所有元素副本插入到pos的前面
    il 将列表元素{ }内的值插入到pos的前面
    (1)插入str的所有内容

    string& insert (size_t pos, const string &str)

    (2)插入str的子字符串(基于范围)

    string& insert (size_t pos, const string &str, size_t subpos, size_t sublen);

    (3)插入C风格字符串

    string& insert (size_t pos, const char* s);

    插入由s指向的以空字符结束的字符串(C风格的字符串)

    (4)插入基于范围的C风格字符串

    string& insert (size_t pos, const char* s, size_t n);

    (5)插入一段相同的字符

    string& insert (size_t pos, size_t n, char c);

    或者

    void insert (iterator p, size_t n, char c);

    插入 n 个字符 c

    (6)插入单个字符

    iterator insert (iterator p, char c);

    (7)迭代器插入

    void insert (iterator p, InputIterator first, InputIterator last);

    插入[first,last)所包含的字符

    (8)插入元素值列表 { a, b, c, ... }

    string& insert (const_iterator p, initializer_list<char> il);


    insert,以上


    (5)、erase

    string& erase (size_t pos = 0, size_t len = npos);

    抹去从 pos 开始,跨度为 len 个字节长度,若无参数,则相当于默认参数,等于了执行成员函数clear

    iterator erase (const_iterator p);

    抹去 p 所指向的字符

    iterator erase (const_iterator first, const_iterator last);

    抹去由范围迭代器所表示的区域

    (6)、swap

    void swap (string& str);

    交换的是两个容器的内部参数,交换过程非常高效,放心使用

    string字符串的处理

    (1)、c_str

    const char* c_str()

    返回的是以空字符结束的字符串(C风格的字符串)

    这个行为最好将返回值拷贝到一个char数组中,因为如果更改string,则返回的指针所表示的内容会被破坏

    如:strcpy ( str, S.c_str() );

    (2)、find

    从前往后查找子串或字符出现的位置。

    1、size_t find (const string& str, size_t pos = 0)

    从下标pos开始查找str,返回str所在的下标位置,找不到的话返回string::npos

    2、size_t find (const char* s, size_t pos = 0)

    一样一样,换成了C风格字符串

    3、size_t find (const char* s, size_t pos, size_t n)

    取 s 中的前 n 个字符参与匹配,pos还是那个意思,从下标pos开始查找str

    4、size_t find (char c, size_t pos = 0)

    查找单个字符在string中的位置

    (3)、rfind

    从后往前查找子串或字符出现的位置。

    和find差不多嘛,留坑,等有空更

    (4)、substr

    string substr (size_t pos = 0, size_t len = npos) const;

    返回一个子字符串,子字符串从原字符串下标 pos 取 len 个长度产生的。

    (5)、compare

    这个挺牛的,有空更,先拿出定义

    1、int compare (const string& str) const;

    2、int compare (size_t pos, size_t len, const string& str) const;

    3、int compare (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);

    4、int compare (const char* s)

    5、int compare (size_t pos, size_t len, const char* s)

    6、int compare (size_t pos, size_t len, const char* s, size_t n)

    五、成员常量

    npos

    static const size_t npos = -1;

    size_t的最大值

    作为返回值,通常用于表示没有匹配项。


    留在结尾的话

    提醒自己:

    • 未更如何构造

    • 未更compare

    • 未更 !=, ==, >, < 操作符的使用规则

    • 未更 find 的其它函数如:find_first_of

    引用:

    [1]:http://c.biancheng.net/view/400.html
    [2]:https://blog.csdn.net/qq_27848347/article/details/91284019
    [3]:http://www.cplusplus.com/reference/string/string/?kw=string
    推荐[4]:https://www.cnblogs.com/zpcdbky/p/4471454.html

    bk