C++ :string类模板的使用

目录

前言:

一、string类模板的介绍

二、string类模板的成员函数的使用

string的构造     

string的赋值运算符重载

iterator迭代器

capacity

Element Access(元素访问)

Modifiers修改字符串

1.+=运算符重载

2.std::string::append

3.void push_back (char c);

4.std::string::assign

5.std::string::insert

6.std::string::erase

7.std::string::swap

8.std::string::pop_back

String operations

copy

find

rfind 

find_first_of

substr

compare

std::operator>> (string)

std::operator<< (string)

std::getline(string)


前言

学完模板以后,基本都知道模板分为函数模板和类模板。它将底层逻辑封装起来,向外提供接口,当使用的时候,只要调用一份模板实例化对象就可以,不需要自己写。这大大提升了写代码的便利。

C语言中,字符串是以'\0'结尾的一些字符的集合。为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数和字符串是分离开的,底层空间要用户自己管理,不注意还会越界访问。所以要学习string类。

在使用string类时,必须包含#include头文件和using namespace std;

一、string类模板的介绍

string的类包含在<string>这个头文件中。

二、string类模板的成员函数的使用

string的构造     

1.string();  无参。实例化一个string对象,这个对象是空的string,长度为0.

2.string(const string& str);  拷贝构造。传了一个const的string类型,传引用,别名是str。把这个str对创建的string对象进行拷贝构造。

3.string (const string& str, size_t pos, size_t len = npos); 子串构造。把从传引用的str的字符串的下标为pos后len个字符拷贝构造给新建的string对象。

如果len没给值,那就默认从pos直到str字符串末尾。

4.string (const char* s);拷贝字符串。把s指针指向的字符串拷贝到新的string对象。s指针指向的需要以\0结尾。

5.string (const char* s, size_t n);  拷贝s指针指向的前n个字符到新建的string对象。

6.string (size_t n, char c); 在string里填充连续n个字符为c

7.template <class InputIterator> string (InputIterator first, InputIterator last); 把这个字符序列以相同的顺序拷贝。支持迭代器的使用。first一般是迭代器的begin(),last可以是begin()+n,或者end()

string的赋值运算符重载

参数可以是string类型的引用,指针(指向字符串),单个字符。赋值完成后,string的长度将会变成新的字符串的长度。

返回*this

iterator迭代器

迭代器可以想象成一个指针,它可能是指针也可能不是。

iterator begin();                     const_iterator begin() const;

begin()   迭代器返回string的开头。返回的是iterator 所以也要用iterator接收。  如果是const属性的,就用第二个。

end()   迭代器返回string的末尾。

rbegin和rend是从后往前数的。

cbegin和cend是对于指向常量字符串使用的。

crbegin和crend是逆置常量字符串使用的。

capacity

1.size_t size() const;     返回字符串的长度,以字节为单位。
2. size_t length() const;  返回字符串的长度,以字节为单位。这个和1功能一样。一开始是length的,但是后来发现length适用字符串而不是和栈堆二叉树等类型,而size应用范围更广,加上不能删length,要兼容以前版本,所以有了两个相同功能的。

3.size_t max_size() const;  返回理论上string可以分配的长度,但是系统的空间并不总是无消耗的,它还可能分配很多其他的空间。所以实际上string并不一定能开到max_size返回的这么大。

4.void resize (size_t n);   void resize (size_t n, char c); resize是改变尺寸,调整大小的意思。如果n比现在的string的size要小,那么缩减string保留前n个。如果n比size要大,那么扩容,如果传了字符c,那么扩容的剩余空间用c初始化,如果没传,就用\0初始化。

5.size_t capacity() const;  返回容量的大小,可以理解为顺序表里的容量。它只是代表分配的内存空间有多大。空间不足需要插入新数据时,会自动扩容。它可以被resize改变。

6.void reserve (size_t n = 0);   扩容的时候可以用它。它可以把空间扩容到n个大小,但不会改变内容,所以也不会改变length或者size。如果n比现在的capacity小,那么不会起作用的。

7.void clear();    清除string的内容,但capacity不变,size为0。

8.bool empty() const;  检查string是否为空,空返回true,其他则返回false。

9.void shrink_to_fit();  没有参数,作用是让capacity和size相等。

Element Access(元素访问)

1.char& operator[] (size_t pos);         const char& operator[] (size_t pos) const;

这个是[]运算符重载,获取字符串的内容,返回pos位置的字符。就跟数组引用功能一样。

如果pos和length相等,并且是const修饰的,那就返回\0。因为length是长度,不是下标。下标要比length少1的,pos作为下标肯定是取不到有效值的。只能取到末尾的\0。

2.char& at (size_t pos);                    const char& at (size_t pos) const;

返回pos位置的字符的引用。如果pos>=size,那么抛异常。

3.char& back();           const char& back() const;

返回字符串最后一个字符的引用。可以和赋值运算符重载结合,修改最后一个字符的value.

4. char& front();const char& front() const;

返回字符串第一个字符的引用。可以和赋值运算符重载结合,修改第一个字符的value.

Modifiers修改字符串

1.+=运算符重载

支持传string类型的对象,char类型的指针和单个字符。

在字符串结尾添加这些。

2.std::string::append

a.追加str的字符串

b.追加str的子串,子串为从下标subpos开始,往后的sublen个位置。

c.追加s指针指向的字符串,并以\0结尾。

d.追加s指针指向的字符串的前n个字符。

e.追加n个字符,连续的n个字符都是给定的c。

f.支持迭代器

3.void push_back (char c);

尾插单个字符

4.std::string::assign

a.把str复制给string对象  (相当于strcpy)

b.复制str的子串,子串为从下标subpos开始,往后的sublen个字符。

c.复制s指向的字符串给对象,以\0结尾。

d.复制s指向的字符串的前n个字符给对象。

e.复制n个指定的字符c给对象。

f.支持迭代器

所谓复制,之前的内容都被清除了,都会被复制后的内容替代。

5.std::string::insert

和前面一样,只是功能变成了插入,从pos位置插入。

6.std::string::erase

a.删除从pos位置开始往后的len个字符。如果pos和len都没给特定值,则默认pos为0,删完。

b.支持迭代器,删除迭代器所指向的字符

c.删除迭代器指向的区间的字符。

7.std::string::swap

void swap (string& str);

交换两个字符串的内容

8.std::string::pop_back

void pop_back();

删除字符串的最后一个字符,会影响length

String operations

copy

size_t copy (char* s, size_t len, size_t pos = 0) const;

复制this指针的pos往后的len个字符到指定的s指针中。

find

在this指针中找特定的字符串中第一次出现的位置,返回它的下标。如果指定了pos,那么就从pos位置开始找,pos之前的忽略不计。

第三个buffer,从this指针中的pos位置开始,找s指针的前n个字符。返回它所在的下标。

第四个  从this指针中pos位置开始找字符c。找到以后返回下标。

找不到返回npos

rfind 

从后往前找,功能类似

find_first_of

这个就是从this指针里找str/s/s的子串.只是find需要全部字符都匹配,而find_first_of则只需要一个字符匹配就可以。给定的字符中的第一个开始匹配。找到了就返回。

没有匹配的字符则返回npos

这个和first不一样的是,它是从给定的字符中的最后一个开始匹配。找到了就返回。

找和给定字符串不匹配的,找到了返回。逻辑和前面的一样。

substr

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

从this指针的pos位置开始的len个长度,拷贝给 string对象进行构造,返回string

compare

比较两个字符串的大小,一个个字符比。哪些字符的话,看具体的函数内容,要用的时候直接去库里看吧。

std::operator>> (string)

istream& operator>> (istream& is, string& str);

支持cin直接从string类型对象里面提取。

std::operator<< (string)

ostream& operator<< (ostream& os, const string& str);

支持cout直接从string类型对象读取输出。

std::getline(string)

可以读取缓存区里的字符。除非遇上\n否则不会停止读取。cin会把'  '看作不同字符串的间隔,不会读取到空格,getline可以。

提供各种运算符重载,支持string类型对象的比较大小。

这些都是通过调用compare函数比较的。

  • 29
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值