【C++】STL —— string基本使用(1)

简介: 【C++】STL —— string基本使用(1)

思维导图(建议收藏,复习小宝贝)

af8844a9dd3f4cdba5c6434ea2fb2473.jpeg

一、STL简介

1.什么是SLT

STL(standard template libaray-标准模板库)

是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。从根本上说,STL是一些"容器"的集合,这些"容器"有list、vector、set、map等,STL也是算法和其他一些组件的集合。

2.STL的六大组件

1ecd1b2606ed46e9956a89f231c9802c.png

网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。

二、string类简介

对于string,在C语言中我们是比较熟悉的;当我们对字符串进行处理时(如:strlen、strcpy、strcat等),但是这些库函数与字符串是分离开的,不太符合OOP(Object Oriented Programming,OOP,面向对象程序设计)的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。


       在C++中,string是用来管理字符数组的一个类,是STL中的一个容器。string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,对于字符串的处理交由string而不是编程人员,大大提升了效率,所有学好STL是很有必要的。  

1ecd1b2606ed46e9956a89f231c9802c.png

在使用string类时,必须包含#include<string>头文件以及using namespace std;

三、string类的常用

      在string类中包含100多种接口函数,但是在日常做题或日后的使用中,经常使用的比较少,我们必须要将这些常见的函数重点掌握,其他大概了解一下,如果有不懂的可以查看C++文档。

1. string类对象初始化操作

1.构造函数

       如下图所示,C++中string类提供了7种构造函数,我们在学习string类时,只需要将默认构造、拷贝构造和含参构造重点掌握及使用,其余了解即可;

1ecd1b2606ed46e9956a89f231c9802c.png

image.png

#include <iostream>
#include <string>
using namespace std;
int main() 
{
  string s1;//默认构造
  string s2("hello world");//含参构造
  string s3(s2);//拷贝构造
  cin >> s1;
  cout << s1 << endl;
  cout << s2 << endl;
  cout << s3 << endl;
  string s4(s2, 2, 6);//从时s2字符串的第二个位置开始拷贝,拷贝6个;
  cout << s4 << endl;
  string s5(s2, 2);
  string s6(s2, 2, 100);//有多少给多少
  return 0;
}

这段代码中有两个地方需要了解一下:

string s4(s2, 2, 6);//从时s2字符串的第二个位置开始拷贝,拷贝6个;
string s5(s2, 2);
string s6(s2, 2, 100);

string(const string& str, size_t pos, size_t len = npos );


       这是表格中第三个函数,从某个已经存在的字符串的第pos个位置向后进行拷贝,由于此函数的第三个形参(len)使用的是缺省参数,默认值是-1,又因为是size_t类型的,他就是整型的最大值,C++处理方式:当len有实参传递时,无论实参多大,向后拷贝的个数仅取决于字符串从pos位置向后的个数(有多少拷贝多少);当len没有实参传递时,默认是-1(整型的最大值)也是有多少拷贝多少;

1ecd1b2606ed46e9956a89f231c9802c.png

Npos是一个静态成员常数值,它是size_t类型元素的最大可能值。

2.析构函数

1ecd1b2606ed46e9956a89f231c9802c.png

系统会自动调用析构函数

3. 赋值重载函数

1ecd1b2606ed46e9956a89f231c9802c.png

image.png

string str1, str2, str3;
str1 = "hello";       // c-string
str2 = 'x';               // 用一个字符赋值
str3 = str1;              // 用一个对象进行

2.string类对象的容量操作

1ecd1b2606ed46e9956a89f231c9802c.png

image.png

1.字符串的检查

int main()
{
  string s1;
  cin >> s1;
  cout << s1 << endl;
  //不包含最后作为结尾标识符的\0,计算的是有效字符长度
  cout << s1.size() << endl;        //求s1的字符个数
  cout << s1.length() << endl;      //求s1的字符长度
  cout << s1.max_size() << endl;    //求s1的最大能存储多少字符
  cout << s1.capacity() << endl;    //求s1的当前的容量
    cout << s1.empty() << endl;       //判空?
  s1.clear();                       //把有效数据给清掉,但是容量并没有清掉
  cout << s1 << "空的字符串" << endl;//检验
  return 0;
}

2.增容的机制

void TestPushBank()
{
  string s;
  size_t sz = s.capacity();
  cout << "capacity changed:" << sz << '\n';
  cout << "making s grow:\n";
  for (int i = 0; i < 1000; ++i)
  {
    //s.push_back('c');
    s += 'c';//尾插字符
    if (sz != s.capacity())
    {    //增容
      sz = s.capacity();
      cout << "capacity changed:" << sz << '\n';
    }
  }
}

1ecd1b2606ed46e9956a89f231c9802c.png

       从上图中可以看出最初的容量是16(虽然图中显示的是15,它计算的是有效空间,其实忽略了'\0'),从第二次增容开始,32->48->71....,以1.5倍增容的;这是在VS的编译器下,如果是在Linux下,它是以2倍的形式增长的;


目录
相关文章
|
12天前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
17 1
|
25天前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
43 7
|
2月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
80 4
|
2月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
88 5
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
68 2
|
28天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
37 0
|
4月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
50 0
java基础(13)String类
|
3月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
75 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
3月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
74 2
|
4月前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①