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天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
21 2
|
12天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
40 5
|
19天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
49 4
|
20天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
46 4
|
2月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
28 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
25 4
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
22 1
|
3月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
40 0
java基础(13)String类
|
2月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
58 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性