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

相关文章
|
13天前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
35 4
|
15天前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
37 5
|
15天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
25 2
|
20天前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
40 0
|
2月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
2月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
74 5
|
3月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
40 0
java基础(13)String类
|
2月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
62 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
2月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
38 2
|
3月前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①