首页 > 编程语言 >C++杂谈:STL

C++杂谈:STL

时间:2023-05-01 20:12:58浏览次数:31  
标签:iterator STL 杂谈 C++ vector 内存 find condition

五一快乐。终于有时间整理一点东西了,笔者这个五一过得是相当初生。大部分人都玩去了,只有我还在赶ddl的世界达成了qwq。不过我觉得还是做了自己想做的事情的。

稍微记录一些前段时间OOP遇到的STL里面乱七八糟的东西。

STL的一些底层实现

  • vector 这个谁都知道,是一个堆上分配的数组,容量不够时进行倍增。均摊\(O(1)\).
  • list 双向链表。
  • map && set 一般认为是红黑树。区别在于,map的节点有两个键值,是关于键的红黑树。
  • unorder系列 一般认为所有无序容器都是hash表实现的,用散列表解决冲突(就是一堆链表那种)
  • deque 与vector不同,双端队列需要支持两侧的操作,它是堆上的分段连续内存构成的;也就是说,当前面/后面内存不够的时候,在堆中的其他位置申请一块定长的内存,另外有一个指针数组来维护这些定长内存的位置,使它看上去像是连续的。

find && find_if

find和find_if是完全不同的两个东西。find是STL里面很多容器都实现了的方法,是考虑了相应的数据结构的。比如在set上进行的查找就是\(O(logN)\)的复杂度。find_if则是STL标准算法库里面的东西,它是一个泛型算法,也就是不会考虑所作用的数据结构的特征。它的使用方式是

auto iterator = find_if(begin_iterator, end_iterator, condition);

其中condition是判定条件,大部分情况下是一个lambda函数。所执行的操作实际上是遍历\([begin\_iterator,end\_iterator)\)之间的元素,遇到第一个满足condition的元素就返回指向该元素的迭代器。也就是说,它永远是\(O(N)\)的。

另外find_if还有一个很隐蔽的问题,它返回的是const_iterator。即使显式声明

set<int>::iterator it = find_if(s.begin(), s.end(), condition);

迭代器也会被隐式地改成const_iterator,无法使用find_if的返回值进行元素的修改。

总而言之一句话,少用find_if。如果有非用不可的场景,十有八九是没有用到正确的容器。

STL的性能

STL的性能是一个谜一样的话题,我现在听到的说法是STL的性能一般,主要是由于STL有很多的安全检查;但我也没找到安全检查的开关。从个人在数据结构的实验中来看,STL确实不如手写的快,但是一般用vector这样的容器只要没有很多的resize操作都是不会死的。

标签:iterator,STL,杂谈,C++,vector,内存,find,condition
From: https://www.cnblogs.com/undermyth/p/17366910.html

相关文章

  • c++ 调用函数,编译器查找函数过程
    假设此处调用函数 inta=1;floatb=1.0;func(a,b);//调用函数若func为非模板函数,编译器查找所有的名称为func的函数,然后检查函数入参的数量,再然后检查每个入参是否都可以转换到目标类型。(此处注意,如果参数类型为类对象,若该类支持隐式转换,那么会出现如下情况:classT......
  • c++回调函数
    回调函数本质上也是普通函数,只是调用机制有所区别——首先通过传参的形式将该函数的地址传递给其他函数,然后在其他函数中通过函数指针调用该函数。在其他函数中通过函数指针调用该函数的过程称为回调,而作为被调用的该函数则被称为回调函数。为什么需要回调函数?满足接口兼容性回......
  • 10分钟搞定!C++类中构造函数和析构函数的完全指南
    一、初步认识构造函数1.什么是构造函数?要了解构造函数就要先了解一下,类的6个默认成员函数,如下图:构造函数:构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。通俗一点来......
  • 【c++】libtorch和qt和opencv部署
    https://blog.csdn.net/rglkt/article/details/125508634opencv和libtorch的兼容问题,只需要下载(cxx11ABI)即可关于slot报错问题:引入torch文件时使用这种办法#undefslots#include<torch/torch.h>#include<torch/script.h>#defineslotsQ_SLOTS命名空间的问题参......
  • 用C/C++在Linux和Android NDK中获取设备的IP地址
    C/C++开发的获取设备IP地址的代码,下面链接中的版本是在Linuxx86-64环境中编译(Centos7.5)的,也可在其它版本的Linux中或者AndroidNDK('armeabi-v7a','arm64-v8a','x86','x86_64'等版本)中编译。下载地址(此版本须在Linuxx86-64环境中运行):金山文档https://kdocs.cn/l/cd4VM3e......
  • C/C++《程序设计基础II》[2023-04-30]
    C/C++《程序设计基础II》[2023-04-30]2022级计算机专业《程序设计基础II》小组项目作业作业要求:1.分小组完成,2-4人一组(每个题目后面有人数要求,见附件1);2.任课老师按小组分配任务;3.作业时长为1周;4.提交内容为:WORD文档,内容包括:题目内容、算法分析、代码实现(要求加注释)、运行结......
  • C++11完美转发及实现方法详解
    C++11标准为C++引入右值引用语法的同时,还解决了一个C++98/03标准长期存在的短板,即使用简单的方式即可在函数模板中实现参数的完美转发。那么,什么是完美转发?它为什么是C++98/03标准存在的一个短板?C++11标准又是如何为C++弥补这一短板的?别急,本节将就这些问题给读者做一一......
  • c++11:std::forward,完美转发
    目录1、不完美转发2、完美转发2.1、引用折叠2.2、std::forward1、不完美转发所谓完美转发,是指在函数模板中,完全按照模板的参数的类型,将参数传递给函数模板中调用的另一个函数。比如:template<typenameT>voidIamForwording(Tt){IrunCodeActually(t);}上面的例子中,IamF......
  • C++ 基础语法
    C++基础语法基本输入输出#include<iostream>usingnamespacestd;intmain(){cout<<"xtloveac"<<endl;return0;}头文件#include<cstdio>包含printf(输出),scanf(输入)#include<iostream>包含cin(读入),cout(输出)usi......
  • C/C++ 各类型int、long、double、char、long long取值范围(基本类型的最大最小值)
    做题的时候经常会使用到数据类型的最大最小值(如int,long,longlong,char等),我也查了很多次,这次就记下来当笔记吧。参考了C++primeplus、各个博客、教程和c++官网,对C/C++中各个类型int、long、double、char、longlong等基本类型的取值范围即最大最小值总结如下:1字节=8位,......