C++ :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函数比较的。
原文地址:https://blog.csdn.net/2301_79490289/article/details/137968085
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!