[笔记]c++基础实践《三》STL详解

简介: [笔记]c++基础实践《三》STL详解

前言

STL(Standard Template Library)标准模板库

STL大致分为六大模块:容器(container),算法(algorithm),迭代器(iterator),仿函数(functor),配接器(adapter),配置器(allocator)

一、容器

container

C++ STL顺序容器详解(一)

你必须要知道所有容器都具有的一个基本特性:

它保存元素采用的是“值”(value)语义,也就是说,容器里存储的是元素的拷贝、副本,而不是引用。

容器操作元素的很大一块成本就是值的拷贝。所以,如果元素比较大,或者非常多,那么操作时的拷贝开销就会很高,性能也就不会太好。

  • 尽量为元素实现转移构造和转移赋值函数,在加入容器的时候使用std::move()来“转移”,减少元素复制的成本:
Point p;                        // 一个拷贝成本很高的对象
v.push_back(p);                // 存储对象,拷贝构造,成本很高
v.push_back(std::move(p));    // 定义转移构造后就可以转移存储,降低成本
// 直接使用C++11为容器新增加的emplace操作函数,它可以“就地”构造元素,免去了构造后再拷贝、转移的成本
v.emplace_back(...);            // 直接在容器里构造元素,不需要拷贝或者转移
  • 容器中存放指针,则必须要自己手动管理元素的生命周期
    如果真的有这种需求,可以考虑使用智能指针unique_ptr/shared_ptr,让它们帮你自动管理元素。

1.1 顺序容器

1.1.1 std::vector

初始化

方法一

vector<int> vi; 

方法二

vector<int> vi(10,10);//size 10,each value 10

方法三

vector<int> vi(arr,arr+10);//begin,end
插入

方法一 push_back

vector<T> a;
T val;
a.push_back( val);//在末尾插入一个元素

方法二 insert

v2.insert(v2.begin()+4, L"3");   //在指定位置,例如在第五个元素前插入一个元素
v2.insert(v2.end(), L"3");   //在末尾插入一个元素
v2.insert(v2.begin(), L"3");   //在开头插入一个元素
查找

方法一 迭代器

#include <algorithm>
  ...
    vector<int> vec;
    ...
    vector<int>::iterator it = find(vec.begin(), vec.end(), value);
    if (it != vec.end()){
    //找到了
    }

方法二 数组查找

std::vector <T> a;
for (size_t i = 0; i < a.size(); i++)
{
  if(value ==  a[i];{
  //找到了
  }
}
遍历

方法一 迭代器

std::vector <T> a;
std::vector <T>::iterator iVector = a.begin();  
while(iVector != a.end())
{
 std::cout<<" dump "<< (*iVector)<<std::endl;
 ++iVector;  
} 

方法二 数组

std::vector <T> v1;
for (size_t i = 0; i < v1.size(); i++)
{
  T tempNum = v1[i];
}
删除
删除最后一个元素
v1.pop_back();   //删除最后一个元素
删除开头的元素
v1.erase(v2.begin()); //删除开头的元素
删除[begin,end]区间的元素
v1.erase(v1.begin(),v1.end); 
删除全部元素

方法一

v1.clear()

方法二

std::vector<T>::iterator iVector = v1.begin();
while(iVector != v1.end())
{
delete (*iVector)->p;
iVector = v1.erase(iVector);
}

方法三

while(pVector->size() != 0)
{
//pop_back方法无返回值
pVector->pop_back();
//删除操作避免大量移动的方法,如果元素有申请堆栈的内存,不可用此方法
}
push_back 与 emplace_back区别

1.2 线性容器

1.1.3 std::list

初始化
list<int> li(10);
list<int> li2(10);
list<int> li3(10,1);//size 10,each value 1
int arr2[10] = {};
list<int> li4(arr2,arr2+10);//begin,end

1.3 关联容器

关联容器底层数据结构:unordered_map/set基于hash表,不保证插入顺序;map/set基于红黑树,根据键自动排序

1.2.1 std::map

插入

方法一 数组

//map[key] = value
map<int,string> mis; 
mis[0] = "first"; 
mis[1] = "second"; 
mis[2] = "third"; 

方法二 pair

//make_pair
map<int,string> mis2(mis.begin(),mis.end());
mis.insert(pair<int, string>(3, "fourth"));

方法三 make_pair

mapStudent.insert(make_pair(1, "student_one")); 

方法四 value_type

//value_type
mis.insert(map<int, string>::value_type(3, "fourth")); 
for (auto& pair : mis){ 
  cout << pair.first << ":" << pair.second.c_str() << endl;
}
查找

方法一

std::map<T,V> m1;
T key;
...
if(m1.find(key) != m1.end){
//找到了
}
删除
删除所有

方法一

cmap.erase(cmap.begin(), cmap.end());

方法二

cmap.clear()
插入
查找
删除
std::multimap

多重映射是允许一个键对应多个附加数据的映射。

1.2.3 std::set

std::multiset

多重集合是允许有重复元素的集合

二、算法

algorithm

算法库

C++STL库之algorithm库

三、迭代器

iterator

cpp 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型

四、仿函数

functor

仿函数(Functor)又称为函数对象(Function Object)是一个能行使函数功能的类。仿函数的语法几乎和我们普通的函数调用一样,不过作为仿函数的类,都必须重载 operator() 运算符。因为调用仿函数,实际上就是通过类对象调用重载后的 operator() 运算符。

五、适配器

adapter

是把一个事物,改造一下接口等等。使得其看起来像一个新的事物。适配器其实是一种应用在STL的设计模式。

六、配置器

allocator

默默完成内存配置与释放,对象构造和析构的工作。

空间配置器

总结


相关文章
|
29天前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
7月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
196 2
|
5月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
166 17
|
7月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
400 73
|
9月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
374 77
|
8月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
7月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
308 3
|
9月前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
244 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
9月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
298 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
9月前
|
算法 C++
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】 目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现二叉排序树的基本算法。 相关知识 为了完成本关任务,你需要掌握:二叉树的创建、查找和删除算法。具体如下: (1)由关键字序列(4,9,0,1,8,6,3,5,2,7)创建一棵二叉排序树bt并以括号表示法输出。 (2)判断bt是否为一棵二叉排序树。 (3)采用递归方法查找关键字为6的结点,并输出其查找路径。 (4)分别删除bt中关键
232 11
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】