C++:STL的引入和string类

简介: C++:STL的引入和string类

STL

STL是什么

什么是STL?STL是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

STL的六大组件

要学一个新知识,知道这个知识从大方向看有什么内容是必须的

六大组件主要如下所示

STL是C++的重要组成部分,如果把前面数据结构模拟实现的过程看成造轮子,那STL就是用前人创造好的轮子进行更高效率的工作

站在前人的肩膀上快速开发

那下面就开始学习string,学习新知识要有阅读文档的能力,有阅读文档的能力是必要的,本文及以后采用的是cplusplus的网站进行文本阅读和知识学习

string

上面是截取自该网站的内容信息,首先从中我们可以获取的信息有,string其实是typedef来的,是由basic_string来的,其次,标准string类通过类似于标准字节容器的接口提供了对此类对象的支持,但添加了专门设计用于操作单字节字符串的特性,前面也将到,string类是提供顺序字符的对象

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
  4. 不能操作多字节或者变长字符的序列

那既然string是一个类,那么就必然有类内的成员函数:

string类内成员函数

string类对象中,成员函数相当多,这里先写一些比较常用的

首先是构造函数:

下面是对构造函数的用法:

#include <iostream>
#include <string>
using namespace std;
int main()
{
  char arr[] = { "hello world" };
  string s1;   // 构造空的string对象
  string s2(arr); // 用cstring构造string类对象
  string s3(10, 'a'); // 构造包含10个a的string类对象
  string s4(s2);  // 拷贝构造
  cout << s1 << endl;
  cout << s2 << endl;
  cout << s3 << endl;
  cout << s4 << endl;
  cout << endl;
  return 0;
}

其次是赋值重载

这是C++98的标准

在C++98的基础上,C++11又做出了新的改变,增加了新的赋值方式,但整体上还是利用C++98较多一些

访问元素的方式

从这里可以看出,运算符重载功能的强大,极大的增加了代码的可读性,以下面的例子来看:

int main()
{
  string s1 = "hello world";
  for (int i = 0; i < s1.size(); i++)
  {
    cout << s1[i] << " ";
  }
  cout << endl;
}

这里表面上看是和C语言中对字符串的遍历一样,事实上并不一样,这里使用的是运算符重载,增加了代码的可读性

下面是和容量相关的操作:

增删查改:

string方便的地方也体现在增删查改上,上面的函数都可以实现对string内内容的增删查改

迭代器

迭代器是STL中的重要组成部分,在几乎所有容器中,迭代器的用法相似,这里对迭代器进行重点介绍,其他容器的用法和这里是大差不差的

首先要看到迭代器是什么?迭代器的作用是什么?

如果从功能来看,迭代器可以理解成指针,利用指针来对string类内存储的数据进行多项操作,迭代器的作用可以对string类内成员进行成员访问,从而进行读和写等其他操作均有

这里首先看begin和end

int main()
{
  string s1 = "hello world";
  string::iterator it = s1.begin();
  while (it != s1.end())
  {
    cout << *it << " ";
    it++;
  }
  cout << endl;
}

上面是迭代器的用法,再看C语言中我们想要访问一个字符串是如何遍历的?

int main()
{
  char s1[] = { "hello world" };
  char* ptr = s1;
  while (*ptr)
  {
    cout << *ptr << " ";
    ptr++;
  }
  cout << endl;
}

从中也可以看出实际上,迭代器从功能来讲就是指针

这里需要注意迭代器的定义是如何定义的

对于不同的迭代器,定义的时候定义方法是不一样的

下面来看rbegin和rend,和前面不同,里面多了一个r,这个r的意思,实际上就是reverse,意思是反转,因此rbegin的意思就是反转着去读取数据

int main()
{
  string s1 = "hello world";
  string::iterator it = s1.begin();
  string::reverse_iterator rit = s1.rbegin();
  while (rit != s1.rend())
  {
    cout << *rit << " ";
    rit++;
  }
  cout << endl;
  while (it != s1.end())
  {
    cout << *it << " ";
    it++;
  }
  cout << endl;
}


相关文章
|
3天前
|
设计模式 安全 编译器
【C++11】特殊类设计
【C++11】特殊类设计
22 10
|
8天前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
39 9
|
3天前
|
存储 编译器 C语言
【C++基础 】类和对象(上)
【C++基础 】类和对象(上)
|
12天前
|
C语言 C++
【C++】string模拟实现(下)
本文档介绍了自定义`string`类的一些关键功能实现,包括`reserve()`用于内存管理,`push_back()`和`append()`添加字符或字符串,运算符`+=`的重载,以及`insert()`, `erase()`进行插入和删除操作。此外,还涵盖了`find()`查找函数,字符串的比较运算符重载,`substr()`获取子串,`clear()`清除内容,以及流插入和提取操作。常量`npos`用于表示未找到的标记。文档以代码示例和运行结果展示各功能的使用。
|
12天前
|
编译器 程序员 C语言
【C++】string模拟实现
这篇博客探讨了自定义实现C++ `string` 类的关键功能,包括构造、拷贝构造、赋值运算符重载及析构函数。作者强调了理解并实现这些功能对于面试的重要性。博客介绍了`string` 类的头文件`string.h`,其中定义了迭代器、基本成员函数如`swap()`、`size()`、`c_str()`等,并提到了深拷贝概念。此外,还展示了构造函数、析构函数和赋值运算符的实现,以及迭代器的定义与使用。博客还包括对C语言字符串函数的引用,以辅助读者理解实现细节。
|
11天前
|
存储
数据存储之数组的特点,长度固定,适应变化需求,集合类特点是空间可变,ArrayList泛型,ArrayList<String> array = new ArrayList<String>()
数据存储之数组的特点,长度固定,适应变化需求,集合类特点是空间可变,ArrayList泛型,ArrayList<String> array = new ArrayList<String>()
|
12天前
|
C++
【C++】string类的使用④(常量成员Member constants)
C++ `std::string` 的 `find_first_of`, `find_last_of`, `find_first_not_of`, `find_last_not_of` 函数分别用于从不同方向查找目标字符或子串。它们都返回匹配位置,未找到则返回 `npos`。`substr` 用于提取子字符串,`compare` 则提供更灵活的字符串比较。`npos` 是一个表示最大值的常量,用于标记未找到匹配的情况。示例代码展示了这些函数的实际应用,如替换元音、分割路径、查找非字母字符等。
|
12天前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。
|
12天前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
12天前
|
C++
C++】string类的使用③(修改器Modifiers)
这篇博客探讨了C++ STL中`string`类的修改器和非成员函数重载。文章介绍了`operator+=`用于在字符串末尾追加内容,并展示了不同重载形式。`append`函数提供了更多追加选项,包括子串、字符数组、单个字符等。`push_back`和`pop_back`分别用于在末尾添加和移除一个字符。`assign`用于替换字符串内容,而`insert`允许在任意位置插入字符串或字符。最后,`erase`函数用于删除字符串中的部分内容。每个函数都配以代码示例和说明。