什么是STL?

STL (standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,更是一个包罗数据结构与算法的软件框架。
STL包含六大组件:容器、仿函数、算法、迭代器、空间配置器、配接器。
STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。

迭代器(itorator)

是一种设计模式(元素访问的一种设计模式),所有容器都需要遵循相同的设计规范。好处就在于每个容器的迭代器使用规范都是一样的。例如usb接口,虽然生产厂家不一样但都可以通用,因为是一个设计模式。
迭代器使用与指针类似
设计模式
正向
begin迭代器:指向第一个元素的位置
end迭代器:指向最后一个元素的下一位置
反向
rbegin迭代器:指向最后一个元素的位置
rend迭代器:指向第一个元素的前一个位置
支持通过*和—>解引用来访问数据
支持++/–操作移动元素位置
支持!= 判断元素
分为const(可读)和非const(可读可写)

   string s2 = "123456";//获取到迭代器string::iterator it = s2.begin();for(; it!=s2.end(); it++){cout << *it << " ";  *it='a';//通过迭代器对内容进行修改 }//反向输出string s3 = "abcdef";string::reverse_iterator rit = s3.rbegin();for (; rit != s3.rend(); rit++){//++是反向的 向前移动cout << *rit << " ";}

支持迭代器访问的自定义类型都可以使用范围for
之前学过对于范围确定的序列可以用范围for来遍历(如数组),其实范围for就是基于迭代器实现的,如果这个类当中有迭代器,就可以使用范围for。

    string s = "abcdef";int arr[] = { 1, 2, 3, 4, 5 };for (const auto& e : arr){cout << e << " ";}cout << endl;//使用范围forfor (auto& ch : s){cout << ch << " ";}cout << endl;

容器

string类(C++字符串)

在C语言中没有字符串类型,字符串表示为字符类型的数组,由\0来表示结束。 而在C++中通过string类,将string类型当做内置类型来使用

明显看到string类是一个char类型的basic_string类模板的实例化对象
头文件 #include< string >
using namespace :: std;

  • 创建string对象
    之前我们定义一个string对象是由一个指针或是字符数组接收的,而现在使用string类对象接收的。
    //创建一个空string对象string s1;//拷贝构造string s2 (s1);string s3("suo");//用一个对象的部分内容创建一个新的对象string s4(s3, 1, 2);//从1号位置开始获取2个字符-—- "uo"//用一个字符串中截取n个字符 创建一个对象string s5("abcdefg", 3);//--"abc"//创建一个string对象,这个对象中包含n个字符cstring s6(10, 'a');// -- "aaaaaaaaaa"string s7 = "fang";//单参构造的隐式类型转换 调用s3那个接口

  • 析构
    ~string(),和普通的析构一样
  • 赋值
    改变对象的内容,并不是创建对象
//三种赋值方式s4 = s3;s4 = "abc";s4 = 'a';
  • 访问取值
    使用[],给的位置不能越界!还有一个at接口,功能一样。
    区别在于给at一个越界位置会抛异常
    分为const对象和非const对象
 //const对象---只读const string s1 = "abcde";s1[2]= 'a';//错误操作//非const对象---可读可写string s2 = "ddddd";s2[4] = 'a';s2.at(3) = 'a';//[]越界,会发生段错误//at接口越界,会抛出异常

string s = "abcdef";int i = 0;for (; i < s.size(); i++){cout << s[i] << " ";}

还有back和front接口,访问有效的最后一个、第一个元素
也可以使用范围for访问

  • 容量相关
    size():不包含\0 ,建议使用
    lenth()和size()一样,返回有效字符个数
    resize():修改有效字符个数,修改后和size()相等,新增默认填充位置为\0可能会影响capacity()
    string类已经不再使用\0来判断字符串是否结束,而是用size()
    //有效字符个数有10个,新增的位置默认填充为\0s.resize(10);s.resize(10,'a');//需要填充的位置都为 acout << s.size() << endl;cout << s[10] << endl;

capacity():string当中最多存放的元素个数(不是字节数!)
一般size()< capacity()
有需要的话 capacity()会扩容

reserve():修改容量,只能增加容量,>=设定值,此接口不影响size()
增容原理是什么呢?
底层是有16个空间,预留一个结束的\0 位置,可用的有15个,到31,到48,再1.5倍增长。先拷贝原有空间再申请增容、释放原有空间
所以一般提前开好空间,避免频繁增容降低效率
clear():清空有效字符,影响size()为0,capacity()不变

shrink _to_size:优化capacity与size的差距,使得capacity>=size.
empty():判空

  • 修改相关
    1、operator += 返回的是引用 、append()、push_back() 都相当于尾插的操作、+返回的是拷贝,尽量选择+=。
string s = "abcdef";s += "abc";cout << s << endl;s.operator+=("1234");cout << s << endl;s.append(s2);//abcdef1234s.append(s2, 2,1);//abcdef12342s.append("789");//abcdef12342789s.append("789", 2);//abcdef1234278978s.append(5, 'a');//abcdef1234278978aaaaas.append(s1.begin(), s1.end());//abcdef1234278978aaaaaabcdecout << s << endl;char* ch = "xyz";s.append(ch, sizeof(ch) / sizeof(ch[0]));//abcdef1234278978aaaaaabcdexyz\0

2、assign()、= 都是赋值的作用

    string s = "abcdef";string s2 = "123";s.assign(s2);s.assign(s2.begin(), s2.end());s = s2;

3、insert()插入,在所给位置前面

    string s = "abcdef";string s2 = "123";s.insert(3, s2);cout << s << endl;s2.insert(s2.end(),s.begin(),s.end());cout << s2 << endl;

4、关系运算符(比较内容是否相同ASSIC码来比较)
5、查找和输出
find:查找字符串,返回值为找到的第一个位置

    string s1="abc1234.efg";string s2("23");size_t found = s1.find(s2);//输出4//从s1的0号开始查找,只找2个字符--34found = s1.find("34hijk", 0, 2);//输出5found = s1.find(".");//输出7

rfind:返回找到的最后一次匹配到的位置,找不到返回正的最大值

    string s1="abc1234.efg123";string s2("23");size_t found = s1.rfind(s2);//输出12

substr:截取字符串,返回值为截取字符串的拷贝

    string s1="abc1234.efg123";//从s1的第3个位置开始截取4个字符string s3 = s1.substr(3, 4);//1234

c_str:就是将C++的string转化为C的字符串数组,c_str()生成一个const char *指针,指向字符串的首地址。

6、字符串输入
cin:遇到空格、换行结束
getline():遇到换行、自定义符号结束

cin >>s;
getline(cin,s);
getline(cin,s,',');

C++———STL(SGI版本)相关推荐

  1. malloc开辟的空间在哪一个区间_C++进阶系列之STL(2)SGI版本空间配置器

    1.STL中的空间配置器在STL中,空间配置器分了2组,分别为一级空间配置器和二级空间配置器,但是它们都有自己各自运用的场合:一般说来,一级空间配置器一般分配的空间大于128B,二级空间配置器的分配空 ...

  2. 详解STL中的空间配置器(SGI版本)

    空间配置器 1.什么是空间配置器 为各个容器高效的管理空间(空间的申请与回收)的 2.为什么需要空间配置器 各种容器----->可以存放元素---->底层需要空间 new 申请空间 ope ...

  3. SGI版本空间配置器

    1.STL中的空间配置器 在STL中,空间配置器分了2组,分别为一级空间配置器和二级空间配置器,但是它们都有自己各自运用的场合:一般说来,一级空间配置器一般分配的空间大于128B,二级空间配置器的分配 ...

  4. C++ Standard Stl -- SGI STL源码学习笔记(07) stl_vector 与 一些问题的细化 3 resize函数剖析...

    前面在介绍push_back函数的时候有说到placement new的用法.前面说的很简单.这几天处理一些其他的事情,直到昨天下午 才有时间看源码,顺便安静的看一下书. 其中我又看到了挂关于plac ...

  5. 上穷碧落下黄泉,源码追踪经验谈——侯捷

    刚刚把开题的准备弄完了,决定好好研究一个开源引擎.看网友评价说几大开源引擎中,Irrlicht比较小,容易入门,所以决定先研究它了.在找Irrlicht相关资料时,看到有人推荐了侯捷老师的这篇文章,觉 ...

  6. 有关SGI STL的alloc

        在STL的使用者层面上,空间配置器一般是隐藏的,使用者不需要知道其具体实现细节即 可进行使用:但是从STL的实现角度来说,由于整个STL的操作对象都存放在容器之内,而容器 需要配置一定的空间来 ...

  7. SGI STL中的alloc

    1. SGI STL实现版本    SGI版本由Silicon Graphics Computer System, Inc公司发展,继承HP版本.所以它的每一个头文件也都有HP的版本声明.此外还加上S ...

  8. stl源码剖析_《STL源码剖析》学习笔记——空间配置器

    目录 1. 空间配置器概述 2. 构造和析构基本工具 3. 空间的配置与释放,std::alloc 4. 内存基本处理工具 1. 空间配置器概述 从STL的实现角度来看,空间配置器的位置尤为重要,整个 ...

  9. C++ STL : 模拟实现STL中的关联式容器map和set

    目录 关联式容器 键值对 底层红黑树的改造 仿函数 红黑树的迭代器 完整代码 set set的文档介绍 set的实现 map map的文档介绍 map的实现 operator[] 完整代码 multi ...

最新文章

  1. TSP - 状态压缩dp
  2. css 两行字变成一行,如何通过CSS将两行文本更改为一行?
  3. Linux SSH免密码登录与拷贝文件(SCP)- 亲测
  4. Spring限定注入逻辑分组@Qualifier
  5. mysql 命令行执行存储过程_mysql 命令行执行存储过程
  6. [Python] set()函数 创建一个无序不重复元素集
  7. Rust : 红楼梦一书中文字符的统计
  8. pbrt源码中用全主元消去法求矩阵逆的实现
  9. 分手后如何忘掉你的前任1
  10. 轻松入门微信小程序云开发(详细)
  11. CCS错误解决:#10247-D null: creating output section “ramfuncs“ without a SECTIONS specification
  12. Saas平台级架构:统一身份认证管理系统用户权限管理
  13. 淘宝前后端分离实践(PPT)
  14. 电商平台数据仓库搭建01-项目介绍
  15. 饥荒无条件制作下载_饥荒完整版
  16. Spring容器中的Bean是否会被GC呢?
  17. 红米android10参数,红米10x5g手机参数红米10x5g手机参数有哪些
  18. 新年快乐(用软件去祝你的好朋友新年快乐,有亿点简陋)C语言
  19. Netty入门与实战教程
  20. cocos 拼图思路

热门文章

  1. 那些年出现的职业倦怠期
  2. 超经典 2008年最龌龊语录100句
  3. 70后80后和90后的巨大区别
  4. 透明图片下载求全透明png图片_25000张PNG免抠透明图片,13G送给你,PS设计师免费领...
  5. RSA加密算法的实现
  6. Node.js 的安装与配置教程
  7. 进阶学习之旅-设计模式之(委派模式策略模式)
  8. css 文字长度超出元素后,以...代替
  9. 使用智能指针错误导致内存泄漏_C++智能指针使用的那些事
  10. GlusterFS基础知识