目录
3.2迭代器(iterator)+string类对象的访问及遍历
3.3.2 capacity() && reserve && resize
3.4.1 push_back && append && assign && insert
一、STL简介
STL(standard template libaray-标准模板库):从表面意思来说,他是c++标准库的重要组成成分,他的组件(接口)是可复用的,管理着数据结构和算法。
1.1STL的版本
- 原始版本--HP版本(所有STL实现版本的始祖),开源版本,允许任何人使用,但后人如对其修改,也需开源。
- P.J.版本--继承自HP版本,在 HP 版本的基础上进行了大量的独立创作和投入,形成了新的商业价值,那么他可以根据自己的意愿选择是否收费,并制定自己的授权协议。被Windows Visual C++采用,不能公开或修改,那么必然有一定的缺陷不容易发现,可读性较低。
- RW版本--继承HP版本,被C++ Builder采用,同样不能修改,可读性较低
- SGI版本--继承HP版本,被GCC(Linux)采用,开源版本,可移植性好,阅读性非常高。在学习过程中,就可以参照这个版本的源码进行研究。
1.2STL六大组件
STL有六大组件,通过一张图来展示,要学的第一个组件就是容器,这些容器接口说白了就是管理数据结构,最重要的基础就是string接口,string产生其实比STL还要早,后来才归类进来,学会这一个,就可以贯通各个接口,因为用法都大差不差。
1.3STL的重要性及缺陷
STL在笔试中、面试中占了很重要的一部分,在工作中也会经常使用,在学习STL的过程中,也不能急于求成,先学会怎么用,再去深入了解底层,再扩展。当然在学习过程中也可能遇到以下问题,当然这应该也是STL的缺陷。
1.STL更新慢。
2.STL现在没有只差线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的
3.STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取
4.STL的使用会有代码膨胀的问题,当然这是模板语法本身导致的。
接下来我们进行学习第一个容器接口string类,并结合所学理解STL的缺陷。
二、string类简介
2.1string类了解
1.string类其实就是一个模板类,typedef过来的,是basic_string模板类的一个实例,用的char来实例化basic_string模板类。
2.管理字符序列的一个类
3.string类有许多接口,这些接口都是用来操作操作字符串
4.这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
2.2为什么学习string类
其实还是一个原则,string类可以更好的面向对象,string类的接口都是拿来使用就行,不需要过分管理底层如何实现,而C语言就不同了,轮子需要自己造,空间需要自己管理 ,不能出错。
那么接下来,就进行学习string类的常用接口有哪些,以及如何使用。
三、string类使用(常用接口)
在介绍string类接口前先说明一下接口会出现的npos,他是成员常量,在接口中扮演缺省值成分,size_t为unsigned int,无符号整形的-1,即整形最大值。也就是不传参,默认就是缺省值。其次在使用string类的接口时包含一下头文件#include <string>
static const size_t npos = -1;
3.1string类的成员函数
3.1.1构造函数
default (1) | string();
|
|
---|---|---|
copy (2) | string (const string& str);
|
|
substring (3) | string (const string& str, size_t pos, size_t len = npos);
|
|
from c-string (4) | string (const char* s);
|
|
from sequence (5) | string (const char* s, size_t n);
|
|
fill (6) | string (size_t n, char c);
|
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;//构造空对象,调用默认构造函数
string s("hello world");//用c-string来构造string类对象
string s1(5, 'x');//创建5个字符x
string s2(s1);//s1拷贝给s2
string s3(s, 5, 3);//从第五个位置,拷贝3个字符给s3
string s4(s, 2);//从第2个位置,npos为整形最大值,默认拷贝后面所有字符给s4,包括'/0'
string s5("hello world", 5);//拷贝前5个字符给s5
cout << s << endl;
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;
cout << s5 << endl;
return 0;
}
运行结果:
3.1.2析构函数
~string():这个基本上不用,编译器会自动调用析构函数,释放对象