【剖析STL】String(一)

简介: 1.什么是STL?标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。

1.什么是STL

标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。

  • 🔥标准模板库是一个C++软件库、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
  • 🔥标准模板库是一个C++软件库类库的同时,保有了更大的可扩展性

1.1STL的缺陷:

  1. STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出
  2. 来已经相隔了13年,STL才进一步更新。
  3. STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。
  4. STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。
  5. STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语

     法本身导致的。

2.Stirng容器

2.1为什么需要学习String容器?

C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,

但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可

能还会越界访问。

为了优化这个问题,我们引入了String容器。

2.2初始String:

string本身是一个类模板:

string就是char类型的数组,char类型一个字节

wstring是wchar类型的数组,wchar为两个字节

char16_t类型为2字节,char32_t为4个字节

  • 🔥string是表示字符串的字符串类
  • 🔥该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  • 🔥string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>
    string;
  • 🔥不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include头文件以及using namespace std;

2.3String类的常用接口说明(注意下面我只讲解最常用的接口)

2.3.1string类对象的常见构造:
  • Strin在C++98下有以下几种构造函数:

第二种: string s3 = "hello world";

这里是一个const char*类型隐式转换成string类型

第三种: string s4(s3, 6, 3);

子字符串构造函数

🔥复制str中从字符位置pos开始并跨越len个字符的部分(如果str太短或len为string::npos,则复制到str的末尾)。

🔥第三个参数有缺省值,npos是无符号整形,-1代表整形最大值为42亿多

string s1;
  string s2("hello world");
  string s3 = "hello world";
  string s4(s3, 6, 3);
  string s5(s3, 6, 13);
  cout << s5 << endl;
  string s6(s3, 6);
  cout << s6 << endl;
  string s7("hello world", 5);
  cout << s7 << endl;
  string s8(10, '*');
  cout << s8 << endl;

  • 本部分会详细介绍以下几个构造函数:
(constructor)函数名称 功能说明
string() (重点) 构造空的string类对象,即空字符串
string(const char* s) (重点) 用C-string来构造string类对象
string(size_t n, char c) string类对象中包含n个字符c
string(const string&s) (重点) 拷贝构造函数
  • string() (重点):

构造空的string类对象,即空字符串

这里的空字符串指的是连\0都没有的

string s1(""); string s2();

  • 🔥s1是只有\0,s2是连\0都没有,s1的size和length都为0,capacity为15,s2没有size和length和capacity

  • string(const char* s) (重点):

复制以s为指向的以空结尾的字符序列(C-string)。

int main()
{
  const char* p = "aaaaa";
  string s1(p);
  cout <<s1 << endl;//aaaaa
  return 0;
}
  • string(size_t n, char c):

用字符c的n个连续副本填充字符串。

string s2(4, 'b'); cout << s2 << endl;//bbbb

  • string(const string&s) (重点)

构造一个str的副本。

string s3(s2);

相关文章
|
29天前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
68 5
|
29天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
50 2
|
2月前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
55 4
|
2月前
|
编译器 C语言 C++
【C++】C++ STL 探索:String的使用与理解(三)
【C++】C++ STL 探索:String的使用与理解
|
2月前
|
存储 编译器 C++
【C++】C++ STL 探索:String的使用与理解(二)
【C++】C++ STL 探索:String的使用与理解
|
2月前
|
编译器 C语言 C++
【C++】C++ STL 探索:String的使用与理解(一)
【C++】C++ STL 探索:String的使用与理解
101 1
|
4月前
|
存储 算法 程序员
【STL】string
【STL】string
|
6月前
|
编译器 C++
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
46 1
|
6月前
|
编译器 C语言 C++
【C++/STL】:string类底层的模拟实现
【C++/STL】:string类底层的模拟实现
46 0
|
6月前
|
算法 C++ 容器
【C++/STL】:string类的基本使用
【C++/STL】:string类的基本使用
44 0