C++STL笔记

本文介绍了C++STL中的核心概念,包括容器如vector、list、deque的特性与操作,迭代器的作用及不同类型的迭代器,以及适配器和内存分配器的功能。重点展示了如何使用迭代器遍历容器并提供了适配器和算法的实例。
摘要由CSDN通过智能技术生成

STL基础知识

STL组成
容器一些封装数据结构的模板类,例如 vector 向量容器、list 列表容器等。
算法STL 提供了非常多(大约 100 个)的数据结构算法,它们都被设计成一个个的模板函数,这些算法在 std 命名空间中定义,其中大部分算法都包含在头文件 中,少部分位于头文件 中。
迭代器在 C++ STL 中,对容器中数据的读和写,是通过迭代器完成的,扮演着容器和算法之间的胶合剂。
适配器可以使一个类的接口(模板的参数)适配成用户指定的形式,从而让原本不能在一起工作的两个类工作在一起。值得一提的是,容器、迭代器和函数都有适配器。
内存分配器为容器类模板提供自定义的内存申请和释放功能,由于往往只有高级用户才有改变内存分配策略的需求,因此内存分配器对于一般用户来说,并不常用。
函数对象如果一个类将 () 运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象(又称仿函数)。

迭代器

  1. 迭代器类别

随机访问迭代器 array/vector/deque
双向迭代器 list/set/multiset/map/multimap
前向迭代器 forward_list /unordered_map / unordered_multimap /unordered_set / unordered_multiset
不支持迭代器 stack / queue

  1. 迭代器定义方式、使用示例
//遍历 vector 容器。
#include <iostream>
//需要引入 vector 头文件
#include <vector>
using namespace std;
int main()
{
    vector<int> v{1,2,3,4,5,6,7,8,9,10}; //v被初始化成有10个元素
    cout << "第一种遍历方法:" << endl;
    //size返回元素个数
    for (int i = 0; i < v.size(); ++i)
        cout << v[i] <<" "; //像普通数组一样使用vector容器
    
     cout << endl << "第二种遍历方法:" << endl;


    //迭代器定义示例
    //创建一个正向迭代器
     vector<int>::iterator i;
    //创建一个常量正向迭代器
    vector<int>::const_iterator i;
    //创建一个反向迭代器
    vector<int>::reverse_iterator i;
    //创建一个常量反向迭代器
    vector<int>::const_reverse_iterator i;
	// 常量迭代器不可修改元素


    //用 != 比较两个迭代器
    for (i = v.begin(); i != v.end(); ++i)
        cout << *i << " ";
    
       cout << endl << "第三种遍历方法:" << endl;
    for (i = v.begin(); i < v.end(); ++i) //用 < 比较两个迭代器
        cout << *i << " ";
   
       cout << endl << "第四种遍历方法:" << endl;
    i = v.begin();
    while (i < v.end()) { //间隔一个输出
        cout << *i << " ";
        i += 2; // 随机访问迭代器支持 "+= 整数"  的操作
    }
}

容器

  1. array
    特点:比普通数组更安全,无法动态扩展或者收缩
#include <array>

// 创建具有 10 个 double 类型元素的 array 容器
std::array<double, 10> values;
// 初始化
std::array<double, 10> values {};
std::array<double, 10> values {0.0, 0.0, 0.1};
// 成员函数
values.begin(); // 返回指向第一个元素的迭代器
values.end(); // 返回指向容器最后一个元素的后一个位置的迭代器
values.at(i); // 返回容器中 i 位置处元素的引用
values.front(); // 第一个元素的直接引用
values.back(); // 最后一个元素的直接引用
values.data(); // 返回容器首个元素的指针
values.fill(1); // 容器填满元素1
values.empty(); // 是否为空
values.size(); // 当前元素的数量
values.max_size(); // 最大容量
array1.swap(array2); // 交换 array1 和 array2 容器中的所有元素,但前提是它们具有相同的长度和类型
  1. vector
    特点:动态数组,可以进行元素的插入和删除,动态调整内存
#include <vector>

// 创建具有 10 个 double 类型元素的 vector容器
std::vector<int> values;
values.reserve(20);//调用 reserve() 不会影响已存储的元素,也不会生成任何元素,只是设置容量,即最少容纳20元素

// 初始化
std::vector<int> values{2, 3, 5, 7, 11, 13, 17, 19}; // 
std::vector<int> values(20);//容量为20
std::vector<int> values(20, 1);//容量为20,且20个元素都是1

// 成员函数
values.capacity(); // 当前元素的数量
values.shrink_to_fit(); // 将内存减少到等于当前元素实际所使用的大小。
values.push_back()	//在序列的尾部添加一个元素。
values.pop_back()	//移出序列尾部的元素。
insert()	在指定的位置插入一个或多个元素。
erase()	移出一个元素或一段元素。
clear()	移出所有的元素,容器大小变为 0swap()	交换两个容器的所有元素。
emplace()	在指定的位置直接生成一个元素。
emplace_back()	在序列尾部生成一个元素。
resize()	改变实际元素的个数。
  1. deque
    特点:双端队列容器,deque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中,当需要向序列两端频繁的添加或删除元素时,应首选 deque 容器。
#include <deque>

// 创建具有 10 个 double 类型元素的 vector容器
std::vector<int> values;
values.reserve(20);//调用 reserve() 不会影响已存储的元素,也不会生成任何元素,只是设置容量,即最少容纳20元素

// 初始化
std::vector<int> values{2, 3, 5, 7, 11, 13, 17, 19}; // 
std::vector<int> values(20);//容量为20
std::vector<int> values(20, 1);//容量为20,且20个元素都是1

// 成员函数
values.capacity(); // 当前元素的数量
values.shrink_to_fit(); // 将内存减少到等于当前元素实际所使用的大小。
values.push_back()	//在序列的尾部添加一个元素。
values.pop_back()	//移出序列尾部的元素。
insert()	在指定的位置插入一个或多个元素。
erase()	移出一个元素或一段元素。
clear()	移出所有的元素,容器大小变为 0swap()	交换两个容器的所有元素。
emplace()	在指定的位置直接生成一个元素。
emplace_back()	在序列尾部生成一个元素。
resize()	改变实际元素的个数。
```,可以进行元素的插入和删除,动态调整内存
```cpp
#include <vector>

// 创建具有 10 个 double 类型元素的 vector容器
std::vector<int> values;
values.reserve(20);//调用 reserve() 不会影响已存储的元素,也不会生成任何元素,只是设置容量,即最少容纳20元素

// 初始化
std::vector<int> values{2, 3, 5, 7, 11, 13, 17, 19}; // 
std::vector<int> values(20);//容量为20
std::vector<int> values(20, 1);//容量为20,且20个元素都是1

// 成员函数
values.capacity(); // 当前元素的数量
values.shrink_to_fit(); // 将内存减少到等于当前元素实际所使用的大小。
values.push_back()	//在序列的尾部添加一个元素。
values.pop_back()	//移出序列尾部的元素。
insert()	在指定的位置插入一个或多个元素。
erase()	移出一个元素或一段元素。
clear()	移出所有的元素,容器大小变为 0swap()	交换两个容器的所有元素。
emplace()	在指定的位置直接生成一个元素。
emplace_back()	在序列尾部生成一个元素。
resize()	改变实际元素的个数。
  1. list
  2. pair
  3. map、unordered_map
  4. set、unordered_set
  5. mutiset、unordered_mutiset

适配器

容器适配器

  1. stack
  2. queue
  3. priority_queue

迭代器适配器

  1. reverse_iterator
  2. insert_iterator
  3. istream_iterator、ostream_iterator
  4. streambuf_iterator
  5. move_iterator

算法

  • sort()排序函数
  • stable_sort()
  • find()函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值