c++学习:STL之string类初识

简介: c++学习:STL之string类初识

1.关于STL

1.什么是STL

STL(standard template library-标准模板库):是c++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包含数据结构预算法的软件框架。

在STL中有常用的数据结构以及其他算法等标准模板提供使用,其中接口非常丰富。

2.STL的六的组件

如图:

7c73c963602f4787b9fc5f16df0ed97d.png

其中迭代器,算法,容器这几大组件非常重要,可以看到在其中有我们认识一些算法swap,find,reverse,配接器中的stack,以及今天来学习的的容器中的string。

2.关于string类的学习

1.为何学习string类

在c语言中我们面对字符串有专门的对字符串操作的库函数string.h,而对于c++,沿用c语言的这种方式显然不符合面向对象的思想,并且其中功能并不全面,我们有时候需要自己实现一些函数,且对于字符串我们都是它是以\0结尾的。

于是在c++中引入了string类:

string类是一个字符串类,区别于c语言中的字符串定义,在c++中创建定义字符串有两种方式:

一种是c风格字符串:

所谓C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。

第二种就是c++引入的string类:

c++ string库中定义了string类提供使用者方便定义字符串以及对字符串的一些操作,这是c++特有的一种方式。

2.何为string类

string类是一个模板类,其类的对象是字符串。

string类就是一个字符串类,该类的接口与常规的容器的接口基本相同,另外添加了一些专门用于操作string的常规操作。

65721c07f1534b1eb1cff590b4b0d9d7.png

55aa14fa768348d881881f5df73e9d07.png

其中类中成员函数,迭代器,容量,元素访问,字符串操作,成员常量,非成员函数重载c++中都详细的给出了定义,见字符串 - C++引用 (cplusplus.com)

可以看到string类中有着丰富的功能,对于我们该做到熟练地使用string类。

3.string类对象的构造

在c++中给出了七中不同情况下的构造函数。

647baf9fdc024da1a52d9dc3264807a9.png

这里给出一般常用的对象的构造:

int main()
{
  string s1;//空字符串构造,默认为空
  cout << s1 << endl;
  string s2("hello world\n");//const string& str  常字符型
  cout << s2 << endl;
  string s3(s2);//拷贝构造
  cout << s3 << endl;
    string s4("hello world",0,5)//截取构造0到5
   cout << s4 << endl;
}

4.容量操作

可以看到对于字符串的一些容量接口

535a48b5b5a2483ab2c41c9c01d1703e.png

这里还是介绍常用的:

#include<iostream>
#include<string>
using namespace std;
int main()
{
  string str("hello world");
  cout << str.size() << endl;//计算字符串大小
  cout << str.length() << endl;//计算字符串长度,包括\0
  cout << str.capacity() << endl;//计算申请空间大小
  str.reserve(100);//预设100个空间,加上本来的
  cout << str.capacity() << endl;
  str.resize(100);//改变字符串大小
  cout << str.size() << endl;
}

5.元素访问的操作

访问的一些操作如下:


b9be9a03587642d28491fe8eb2151a33.png

注意这里的[ ],这里是重载了[ ],以便它能访问类里的字符串,且为常量字符串(一般我们初始化对象时为常量字符串),一般定义在类里面,这里也只对[ ]介绍一下:

int main()
{
  string str("hello world");
  for (int i = 0; i < str.size(); i++)
  {
    cout << str[i] ;
  }
  cout << endl;
  //利用[]访问常量字符串中的每个元素
  //因为在重载时是利用了引用,因此这里还可以修改
  str[1] = 'w';
  cout << str[1];
  //当然在定义string的对象时,对于const 修饰的类型是无法被修改的
  const string str1("hello world");
  //str1[1] = 'w';  报错
}

6.迭代器(Iterators

对于所有的STL中都会有一个迭代器,在这里你可以将迭代器理解为一个变量或者指针,因为要访问顺序容器和关联容器的元素,我们就用迭代器来遍历,读取,它是做为一个媒介,可以指向容器中的某个元素,类似指针的指向。


138d7949780d4f1d8bfcb8da5b5a6d6d.png

这里我们浅浅说一下

int main()
{
  string str("hello world");
  //可以类似定义一个迭代器(可理解为指针)指向容器中的某个元素
  string::iterator i = str.begin();//指向开始的元素
  while (i!=str.end())
  {
    *i = ' x';//当然我们也可以修改迭代器中所保存指向的元素
    cout << *i;
    i++;
  }
  cout << endl;
}

7.修改类的操作

a783e9dcfea1433ca59760937a5db56f.png

可以看到有很多修改操作,这里也展示一些常用的:

int main()
{
  //push_back  追加一个字符
  string s1("hello world");
  s1.push_back('!');
  cout << s1 << endl;
  //append   追加一个字符串
  s1.append(" haha");
  cout << s1 << endl;
  //operator+=,重载了+=,作用是追加,这里给了两种函数接口,是综合了前两种的追加
  //操作是两个对象
    //insert   插入
  s1.insert(5, "hello");//在第五个位置处插入
  cout << s1 << endl;
  //c_str  返回字符数组的一个指针,返回类型为const char *
  const char* ch;
  ch = s1.c_str();
  cout << *ch<<endl;
}

0ec3fdbc07fb49e696e1bbce57a6385d.png

8.字符串操作

b87ffe0387364709af0041ead06ec4fb.png

这里简单介绍常用的:

int main()
{
  string s1("hello world");
  string s2("hello");
  //查找 find,其返回类型为整形,若查找到了,返回与匹配项相同的第一个字符的位置,否则返回string::npos(一个无符号整型)
  if (s1.find(s2) != string ::npos)
  {
    cout << s2 << "存在于" << s1 << endl;
  }
  else
  {
    cout << s2 << "不存在于" << s1 << endl;
  }
  //这里也可以从给的索引位置查找
  //s1.find(s2,5) != string ::npos 从s2的第五个开始查找、
  //可查找字符,或字符串
  //rfind  从后面往前查找,找到返回位置
  string filename("test.txt.tar.zip");
  size_t pos = filename.rfind(".");
  //substr  取一段子字符串 即截取
  string suffix = filename.substr(pos);//pos处开始截取
  cout << suffix;
}

7d04a4eb4ee94f9894cd9e847d159a2c.png

相关文章
|
6天前
|
并行计算 Unix Linux
超级好用的C++实用库之线程基类
超级好用的C++实用库之线程基类
12 4
|
6天前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
6天前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
6天前
|
存储 运维 监控
超级好用的C++实用库之日志类
超级好用的C++实用库之日志类
13 0
|
17天前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
60 30
|
1月前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)
|
2月前
|
存储 安全 编译器
【C++】类和对象(下)
【C++】类和对象(下)
【C++】类和对象(下)
|
1月前
|
C++
C++(十六)类之间转化
在C++中,类之间的转换可以通过转换构造函数和操作符函数实现。转换构造函数是一种单参数构造函数,用于将其他类型转换为本类类型。为了防止不必要的隐式转换,可以使用`explicit`关键字来禁止这种自动转换。此外,还可以通过定义`operator`函数来进行类型转换,该函数无参数且无返回值。下面展示了如何使用这两种方式实现自定义类型的相互转换,并通过示例代码说明了`explicit`关键字的作用。
|
1月前
|
存储 设计模式 编译器
C++(十三) 类的扩展
本文详细介绍了C++中类的各种扩展特性,包括类成员存储、`sizeof`操作符的应用、类成员函数的存储方式及其背后的`this`指针机制。此外,还探讨了`const`修饰符在成员变量和函数中的作用,以及如何通过`static`关键字实现类中的资源共享。文章还介绍了单例模式的设计思路,并讨论了指向类成员(数据成员和函数成员)的指针的使用方法。最后,还讲解了指向静态成员的指针的相关概念和应用示例。通过这些内容,帮助读者更好地理解和掌握C++面向对象编程的核心概念和技术细节。
|
2月前
|
存储 算法 编译器
c++--类(上)
c++--类(上)
下一篇
无影云桌面