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

相关文章
|
1天前
|
存储 编译器 程序员
【C++高阶】C++继承学习手册:全面解析继承的各个方面
【C++高阶】C++继承学习手册:全面解析继承的各个方面
|
1天前
|
编译器 C++
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
|
1天前
|
安全 算法 C语言
【C++进阶】深入STL之string:掌握高效字符串处理的关键
【C++进阶】深入STL之string:掌握高效字符串处理的关键
【C++进阶】深入STL之string:掌握高效字符串处理的关键
|
1天前
|
编译器 C++
【C++初阶】—— 类和对象 (下)
【C++初阶】—— 类和对象 (下)
|
1天前
|
存储 编译器 C++
【C++初阶】—— 类和对象 (中)
【C++初阶】—— 类和对象 (中)
|
1天前
|
存储 编译器 C语言
【C++初阶】—— 类和对象 (上)
【C++初阶】—— 类和对象 (上)
|
2天前
|
程序员 C语言 C++
【C++语言】继承:类特性的扩展,重要的类复用!
【C++语言】继承:类特性的扩展,重要的类复用!
|
2天前
|
编译器 数据安全/隐私保护 C++
c++primer plus 6 读书笔记 第十三章 类继承
c++primer plus 6 读书笔记 第十三章 类继承
|
2天前
|
存储 C++
C++类的实例:Stock(股票)类。
C++类的实例:Stock(股票)类。
|
2天前
|
编译器 C++
c++primer plus 6 读书笔记 第十章 对象和类
c++primer plus 6 读书笔记 第十章 对象和类