本文介绍的是C++关键字string中一些重要用法,以及各种字符串序列的处理操作
——飘飘何所似,天地一沙鸥
文章目录
- 前言
- 一、string(字符串类)
- 二、string类对象的容量操作
- 2.1 size/length
- 2.2 capacity
- 2.3 empty/clear
- 2.4 resize/reserve
- 三、string类对象的访问及便利操作
- 3.1 operator[]
- 3.2 begin+end(迭代器)
- 3.3 范围for
- 四、string类对象的修改操作
- 4.1 operator+=/push_back/append
- 4.2 c_str
- 4.3 find/rfind
- 4.4 substr
前言
string是C++、java、VB等编程语言中的字符串,字符串是一个特殊的对象,属于引用类型。 在java、C#中,String类对象创建后,字符串一旦初始化就不能更改,因为string类中所有字符串都是常量,数据是无法更改,由于string对象的不可变,所以可以共享。对String类的任何改变,都是返回一个新的String类对象。 C++标准库中string类以类型的形式对字符串进行封装,且包含了字符序列的处理操作。
一、string(字符串类)
- 字符串是表示字符序列的类。
- 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
- string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。
- string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits
和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。 - 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
总结:
- string是表示字符串的字符串类。
- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
- string在底层实际是:basic_string模板类的别名typedefbasic_string<char,char_traits,allocator> string;
- 不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include头文件以及using namespace std;
二、string类对象的容量操作
2.1 size/length
size_t size() const;
计算字符串长度类接口
#include<iostream>
using namespace std;
int main()
{//创建string类型的字符串str
string str = ("hello C++");
//计算str大小
std::cout << "The size of str is " << str.size() << " bytes.\n";
return 0;
}
length与size并没有什么区别,仅仅只是在STL没有出现时,length就已经存在了,而我们也知道语言的发展一定是向下兼容的它不会去删除原有的东西,只会出现更多的补丁和更加新鲜的东西
#include<iostream>
using namespace std;
int main()
{
string str = ("hello C++");
std::cout << "The size of str is " << str.size() << " bytes.\n";
std::cout << "The size of str is " << str.length() << " bytes.\n";
return 0;
}
2.2 capacity
size_t capacity() const;
计算string类空间大小
#include<iostream>
using namespace std;
int main()
{
string str = ("hello C++");
std::cout << "The size of str is " << str.size() << " bytes.\n";
std::cout << str.capacity() << endl;
return 0;
}
2.3 empty/clear
bool empty() const;
检出字符串释放为空串,是则返回ture,否返回false
void clear();
清空字符串但是不会删除该字符串空间
仅仅只是一个判断string类字符串是否已经置为空。
S1中内容已经被删空但是我们看到S1所在空间并没有被释放还是在原来的地址,并且可以访问到,存入新的东西。
2.4 resize/reserve
void resize (size_t n);
void resize (size_t n, char c);
将有效字符改为n,并将多余的空间用c填充
void reserve (size_t n = 0);
为字符串预留空间
先将s的内容改为和s1一致然后对他们分别使用resize/reserve进行扩容,最后分别输出他们的内容和他们所扩容空间的大小。
resize/reserve根本的区别就在于一个对它所开的空间进行初始化而另一个并不会对开的空间进行初始化,还有一点就是当所开空间小于原有空间时他会保留前面n个数据,然年舍弃多余的部分
另外,在进行空间开辟工作时候,最后事先知道空间用量进行提前预留使用reserve会极大的提高时间复杂度
三、string类对象的访问及便利操作
3.1 operator[]
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
返回pos位置的字符,const string类对象调用
不做过多介绍类似于数组的方式来直接获取第pos个数据
3.2 begin+end(迭代器)
iterator begin();
const_iterator begin() const;
迭代器是string中便利字符串的一种重要工具,具体实现如下
3.3 范围for
范围for的底层实现就是调用迭代器,在使用的时候借用了关键字auto可以不用定义冗余的类型算是一种很方便的用法不过多介绍,代码如下
for(auto ch:s)
{
cout<<ch<<" ";
ch++;
}
cout<<endl;
四、string类对象的修改操作
4.1 operator+=/push_back/append
string& operator+= (const string& str);
string& operator+= (const char s);
string& operator+= (char c)*
最便捷的一种追加方式+=直接在原字符串上进行,可以追加string类/字符串/字符,直接+=
void push_back (char c);
尾插字符c,就是顺序表/链表的那种尾插方式,遍历尾插,不建议用效率很低
operator+=可以随意的进行字符/字符串/类的追加
append!是坑不作介绍不建议用
4.2 c_str
const char c_str() const;*
c_str()是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。 换种说法,c_str ()函数返回一个指向正规C字符串的 指针常量 ,内容与本string串相同。
c_str()返回的是一个临时指针随着原指针指向位置数值的改变
这样看来c_str好像没有实际的意义与用途,其实s_str多用于与其他各种操作一起进行我们只需要了解他的用法就可以,一般不会单独使用来实现什么东西。在进行c_str的使用时尽量在每次都strcpy一下防止丢失。
int main() {
char ptr[5];
string s = "12345";
strcpy(ptr, s.c_str());
cout << "s改变前ptr为:" << ptr << endl;
s = "66666";
cout << "s改变后ptr为:" << ptr << endl;
return 0;
//结果 ptr=”12345“
}
4.3 find/rfind
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char s, size_t pos = 0) const;
size_t find (const char s, size_t pos, size_t n) const;
size_t find (char c, size_t pos = 0) const;**
从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
此处我使用的是省略第二个参数,那么它所默认的位置就是从0位置开始查找也就是从S3字符串的h开始查找。
rfind则是反向查找
4.4 substr
string substr (size_t pos = 0, size_t len = npos) const;
在str中从pos位置开始,截取n个字符,然后将其返回
这是一个很好玩的接口,从第n个字符开始截取字符串中m个字符返回赋予,当我们知道某个分字符串在总字符串中的位置的时候,就可以定向的将所知的分字符串赋予任意一变量
在string类中它充当的是字符串截取的功能