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

相关文章
|
10天前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
24 0
java基础(13)String类
|
7天前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①
|
10天前
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
27 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
17天前
|
安全 Java
Java StringBuffer 和 StringBuilder 类详解
在 Java 中,`StringBuffer` 和 `StringBuilder` 用于操作可变字符串,支持拼接、插入、删除等功能。两者的主要区别在于线程安全性和性能:`StringBuffer` 线程安全但较慢,适用于多线程环境;`StringBuilder` 非线程安全但更快,适合单线程环境。选择合适的类取决于具体的应用场景和性能需求。通常,在不需要线程安全的情况下,推荐使用 `StringBuilder` 以获得更好的性能。
|
17天前
|
Java 索引
Java String 类详解
Java 中的 `String` 类用于表示不可变的字符序列,是 Java 标准库 `java.lang` 包的一部分。字符串对象一旦创建,其内容不可更改,修改会生成新对象。
|
11天前
|
Java 索引
java基础扫盲-String类常用的方法
java基础扫盲-String类常用的方法
|
2月前
|
API 索引
String类下常用API
String类下常用API
38 1
|
2月前
for循环和String类下方法的一个练习题
for循环和String类下方法的一个练习题
45 1
|
20天前
|
存储 安全 Java
Java——String类详解
String 是 Java 中的一个类,用于表示字符串,属于引用数据类型。字符串可以通过多种方式定义,如直接赋值、创建对象、传入 char 或 byte 类型数组。直接赋值会将字符串存储在串池中,复用相同的字符串以节省内存。String 类提供了丰富的方法,如比较(equals() 和 compareTo())、查找(charAt() 和 indexOf())、转换(valueOf() 和 format())、拆分(split())和截取(substring())。此外,还介绍了 StringBuilder 和 StringJoiner 类,前者用于高效拼接字符串,后者用于按指定格式拼接字符串
20 1
Java——String类详解
|
2月前
|
Java API 索引
【Java基础面试二十四】、String类有哪些方法?
这篇文章列举了Java中String类的常用方法,如`charAt()`、`substring()`、`split()`、`trim()`、`indexOf()`、`lastIndexOf()`、`startsWith()`、`endsWith()`、`toUpperCase()`、`toLowerCase()`、`replaceFirst()`和`replaceAll()`,并建议面试时展示对这些方法的熟悉度,同时深入理解部分方法的源码实现。
【Java基础面试二十四】、String类有哪些方法?