IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ STL库学习笔记1 -> 正文阅读

[C++知识库]C++ STL库学习笔记1

C++ STL库学习

概述

STL库主要分为三类,容器类,迭代器类和算法类,算法类还没有研究,主要总结下容器类和迭代器类。

其中三者的关系:容器存储数据,算法通过迭代器访问容器中的数据。三者关系如下图:
在这里插入图片描述
容器类主要分为顺序容器,适配器,关联容器。

顺序容器主要是vector,list和dequeue,其中vector可以通过下标访问,内存是连续的,而list和dequeue是链表,内存地址不连续。

适配器比较特殊,首先栈stack和queue的默认容器是dequeue,优先队列(堆)默认容器是vector,但可以指定一种容器作为适配器的模板类型参数,然后这种类型的容器通过适配器的接口就可以实现适配器数据结构的特性。

比如,使用vector作为stack的模板参数,这个vector也可以像栈一样使用。

说到适配器和容器,这里有一个比较明显的区别,在容器尾部插入数据一般用c.push_back(),但是对于适配器的栈,队列或者堆,就只有a.push()操作,我理解为容器因为有头尾之分,所以在这里做了区别,但对于栈,队列或者堆这种数据结构,只有区别只有进数据和出数据的区别,所以就没有push_back()操作了。另外,容器可以借助迭代器遍历,但适配器并没有迭代器,可能是后面这三种数据结构不关注遍历操作,而是更关注数据间的相对关系。

关联容器主要是pair,map,set,multiset和multimap,其中pair和map用得比较多。

迭代器

迭代器和指针类似,通过如下方式声明迭代器

vector<int> c;
vector<int>::iterator it = c.begin();

需要注意的是,迭代器也有区别,可分为单边迭代器,双边迭代器和随机迭代器。

单边迭代器只能向某一边进行++或者–操作(++iterator),双边迭代器同时支持++与–操作,但这两者的比较符只支持==操作。

随机迭代器除了支持++,–操作,还支持+n,-n操作,比较操作符同时支持<,<=,>,>=操作符。

下面是不同容器对应的迭代器:

容器迭代器功能
vector随机访问
deque随机访问
list双向
set双向
map双向
stack不支持迭代器
queue不支持迭代器
priority_queue不支持迭代器

因此在使用迭代器遍历容器数据时,对于list,set,map的截止条件应该如下形式,否则会报错。

std::list<int> alist(3,9);
for(auto it = alist.begin();it!=alist.end();++it){
    std::cout<<*it<<"\n";
}

因为双边迭代器只支持==与!=操作,而对于vector,则除了上面这种形式以外,还支持下面这种遍历形式

std::vector<int> avector(3,9);
for(auto it = avector.begin();it<avector.end();++it){
     std::cout<<*it<<"\n";
}

范围for循环

范围for循环基于一个名为范围变量的量,每次拷贝容器中的元素赋值给范围变量,范围for循环不用担心访问越界的问题。

基于访问的目的,如果只是读取元素,基础数据类型赋值比引用快,大型类对象则引用比赋值快。

std::vector<int> avector(8,0);
for(auto it:avector){
 std::cout<<it<<"\n";
}

或者

std::vector<int> avector(8,2);
for(const auto it:avector){
 std::cout<<it<<"\n";
}

大型数据对象T的话

std::vector<T> avector(3,T);
for(const auto & it: avector){
it.print();
}

如果是需要对容器内数据进行修改,则使用引用访问,因为此时范围变量是数据成员的一个别名

std::vector<T> avector(3,T);
for(auto & it: avector){
    it = T();
}

此时范围变量是数据成员的一个别名

std::vector<T> avector(3,T);
for(auto & it: avector){
    it = T();
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:26:01  更:2022-05-18 17:28:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 18:25:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码