首页 > 编程语言 >C++ // 2023/4/13

C++ // 2023/4/13

时间:2023-04-13 21:22:53浏览次数:45  
标签:容器 13 set end iterator 元素 begin C++ 2023

stl

  • **序列式容器**:强调值的排序,序列式容器中的每个元素均有固定的位置。     **关联式容器**:二叉树结构,各元素之间没有严格的物理上的顺序关系
    质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
    非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等   **迭代器:**容器和算法之间粘合剂
    提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。     每个容器都有自己专属的迭代器
    迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针   注意在容器里面存放 指针和对象的区别, 容器里面可以套容器!!   string 是 stl str3.append(" love ");   find查找是从左往后,rfind从右往左 str.insert()   str.erase()  str.substr(1, 3);   **vector与普通数组区别:**
    * 不同之处在于数组是静态空间,而vector可以**动态扩展**   * `resize(int num);`             //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
      ​                       //如果容器变短,则末尾超出容器长度的元素被删除。
    * `resize(int num, elem);`  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
      ​                           //如果容器变短,则末尾超出容器长度的元素被删除   * front返回容器第一个元素 * back返回容器最后一个元素   总结:swap可以使两个容器互换,可以达到实用的收缩内存效果 `reserve(int len);`//容器预留len个元素长度,预留位置不初始化,元素不可访问。  
    * vector对于头部的插入删除效率低,数据量越大,效率越低 * deque相对而言,对头部的插入删除速度回比vector快 * vector访问元素时的速度会比deque快,这和两者内部实现有关    
    • push_back(elem); //在容器尾部添加一个数据
    • push_front(elem); //在容器头部插入一个数据
    • pop_back(); //删除容器最后一个数据
    • pop_front(); //删除容器第一个数据

     

    • 利用算法实现对deque容器进行排序

    算法:

    • sort(iterator beg, iterator end) //对beg和end区间内元素进行排序

    list的优点:

    • 采用动态存储分配,不会造成内存浪费和溢出
    • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

    list的缺点:

    • 链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大

    sort

    bool myCompare(int val1 , int val2)
    {
    	return val1 > val2;
    }

    • set/multiset属于关联式容器,底层结构是用二叉树实现。

    set和multiset区别

    • set不允许容器中有重复的元素
    • multiset允许容器中有重复的元素
    s1.insert(40);

    • 删除 --- erase
    • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
    • count(key); //统计key的元素个数
    set<int>::iterator pos = s1.find(30);

    • set不可以插入重复数据,而multiset可以
    • set插入数据的同时会返回插入结果,表示插入是否成功
    • multiset不会检测数据,因此可以插入重复数据
    • set<int> s;
      	pair<set<int>::iterator, bool>  ret = s.insert(10);
      	if (ret.second) {
      		cout << "第一次插入成功!" << endl;
      	}
      	else {
      		cout << "第一次插入失败!" << endl;
      	}
     
    • pair<type, type> p ( value1, value2 );
     
    class comparePerson
    {
    public:
    	bool operator()(const Person& p1, const Person &p2)
    	{
    		//按照年龄进行排序  降序
    		return p1.m_Age > p2.m_Age;
    	}
    };


    • map中所有元素都是pair
    • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
    • 所有元素都会根据元素的键值自动排序
     
    • map/multimap属于关联式容器,底层结构是用二叉树实现。
    m.insert(pair<int, int>(3, 30));
    • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
    • erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
    • erase(key); //删除容器中值为key的元素
    • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
    • count(key); //统计key的元素个数
     binary_search(v.begin(), v.end(),2);

    count_if(iterator beg, iterator end, _Pred);
    int num = count_if(v.begin(), v.end(), Greater4());

    • sort //对容器内元素进行排序
    • random_shuffle //洗牌 指定范围内的元素随机调整次序
    • merge // 容器元素合并,并存储到另一容器中
    • reverse // 反转指定范围的元素

     

    //从大到小排序
    sort(v.begin(), v.end(), greater<int>());
    srand((unsigned int)time(NULL));
    random_shuffle(v.begin(), v.end());
    for_each(vtarget.begin(), vtarget.end(), myPrint());
    class myPrint
    {
    public:
    	void operator()(int val)
    	{
    		cout << val << " ";
    	}
    };
     
    	vector<int> vtarget;
    	//目标容器需要提前开辟空间
    	vtarget.resize(v1.size() + v2.size());
    	//合并  需要两个有序序列
    	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vtarget.begin());


    **merge合并的两个容器必须的有序序列
    reverse(iterator beg, iterator end);
    很多东西都要考虑的容器大小,要不要拓展
    v2.resize(v1.size());
    copy(v1.begin(), v1.end(), v2.begin());

    replace(iterator beg, iterator end, oldvalue, newvalue);

    // 将区间内旧元素 替换成 新元素

    	//将容器中的20 替换成 2000
    	
    	replace(v.begin(), v.end(), 20,2000);
    replace_if(v.begin(), v.end(), ReplaceGreater30(), 3000);


    replace_if按条件查找,可以利用仿函数灵活筛选满足的条件
     
    • 计算区间内 容器元素累计总和
    • accumulate(iterator beg, iterator end, value);

    • 向容器中填充指定的元素

     

    • fill(iterator beg, iterator end, value);

    • set_intersection // 求两个容器的交集

    • set_union // 求两个容器的并集

    • set_difference // 求两个容器的差集

    •    set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    • 
      
    注意:两个集合必须是有序序列


     



                 

标签:容器,13,set,end,iterator,元素,begin,C++,2023
From: https://www.cnblogs.com/Lamboofhome/p/17316440.html

相关文章

  • C++课本第三章例题
    3-2输入一个8位二进制数,将其转换为十进制数输出。1#include<iostream>2usingnamespacestd;3doublepower(doublex,intn);//函数的声明,double类型防止超出整型4intmain()5{6intnumber=0;7for(inti......
  • macOS 13.4Beta 2 OpenCore 0.9.2双引导分区原版黑苹果镜像
    镜像特点文章原地址:http://www.imacosx.cn/113041.html(转载请注明出处)完全由黑果魏叔官方制作,针对各种机型进行默认配置,让黑苹果安装不再困难。系统镜像设置为双引导分区,全面去除clover引导分区(如有需要,可以自行直接替换opencore分区文件为clover引导文件)备注:此镜像仅适用与16g优盘......
  • 2023.4.13每日总结
    完成使用jdbc实现使用excel批量插入数据到数据库packagewangzhan;importjava.io.FileInputStream;importjava.io.InputStream;importjava.net.URLDecoder;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.Statement;importjxl.Cell......
  • 一、图论基础知识(2023.4.13初版[个人向])
    1.图的定义和概念1.图的定义图(Graph)是由顶点的有穷非空集合V和顶点之间的边的集合E组成,通常表示为G={V,E},其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合1.图中点的数据元素称之为顶点线性表中的数据元素称为元素数中的数据元素称为结点2.线性表和树均可以没有元素,......
  • JAVAWEB-项目搭建准备工作八步骤-2023-04-13
    第一步:生成一个javamavenweb项目第二步:配置TOMCAT第三步:测试项目是否可以跑起来第四步:导入maven各个jar包+增加build解决资源导出问题<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://ww......
  • 2023/4/13
    1、输入一个整数,将其顺序反转后输出   (dowhile语句)#include<iostream>usingnamespacestd;intmain(){ intn,s; cin>>n; do{ s=n%10;          //取末尾数字 cout<<s; n=n/10;          //将原数的末尾数字割除 }while(n!=0......
  • 2023-4-12美团测开一面
    自我介绍介绍工作绩效、测试平台的开发介绍一下预约挂号平台医院的源数据信息是自己录的吗后端有使用mysql吗整体的数据量redis项目中的作用springcloud是怎么使用的后台有几个微服务java中concurrentHashMap什么时候进行红黑树扩树线程池的固定参数threadLoca......
  • 2023-4-13美团测开二面
    1.自我介绍2.写项目的背景是什么3.为什么使用SpringCloud,主要适用于哪些功能4.为什么用MongoDB5.MongoDB和Redis哪个更快6.拷贝数组有几种方式,哪种方式效率更高效率从高到低:System.arraycopy、clone、(Arrays.copyOf、Arrays.copyOfRange)、for循环。7.Integ......
  • 2023/04/12刷题
    C.MakeItGood链接C.MakeItGood这个题是说去掉前缀,我们可以发现如果一个数列可以分为一个连续的上升区域和一个连续的下降区域的话,该数列是好的,该题的思路就是从后向前找到符合该特征的最长的序列#include<iostream>#include<algorithm>#include<cstdio>#includ......
  • 随笔20230413
    突然很想找个根本不讲中文的国家生活个一年两年。远离世俗、所有人,只和自己的灵魂独处一会,仔细地问问自己,你、我究竟从何而来,又终将魂归何处。我有深厚的基础生物知识,我系统学习过大量的理工科知识,我理解万事万物都有其运行的规律我明白一切缘起都终将湮灭可是我还是固执的认......