C++STL之vector与list

news/2024/11/29 20:31:34/

文章目录

  • 关于vector的用法
  • 关于List的用法
  • vector和list的区别

关于vector的用法

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;class PtrInt
{int* ptr;
public:PtrInt(int x = 0) :ptr(new int[x]){cout << "Create PtrInt:" << endl;}PtrInt(const PtrInt& pt) :ptr(new int()){if (pt.ptr!=nullptr){*ptr = *pt.ptr;}cout << "Copy Create:" << endl;}PtrInt& operator=(const PtrInt& pt){if (this != &pt){delete ptr;ptr = new int();if (pt.ptr != nullptr){*ptr = *pt.ptr;}cout << "operator=()" << endl;}}PtrInt(PtrInt&& pt) :ptr(pt.ptr){pt.ptr = nullptr;cout << "move create" << endl;}PtrInt& operator=(PtrInt&& pt){if (this != &pt){delete ptr;ptr = pt.ptr;pt.ptr = nullptr;}cout << "move operator=()" << endl;}~PtrInt(){delete ptr;ptr = nullptr;cout << "Destory PtrInt" << endl;}void Print()const{if (ptr != nullptr){cout << *ptr << endl;}}void SetValue(int x){if (ptr = nullptr){*ptr = x;}else{ptr = new int(x);}}int GetValue()const{if (ptr != nullptr){return *ptr;}else{return -1;}}
};int main()
{std::vector<PtrInt>ar;for (int i = 0; i < 20; ++i){ar.push_back(PtrInt(i));//构建无名对象cout << "Size:" << ar.size() << endl;;cout << "capacity" << ar.capacity() << endl;}
}#if 0
class Int
{
private:int value;
public:Int(int x=0):value(x){}~Int(){}
};int main()
{std::vector<int>iar = {12,23,34,45,56,67,78,89};std::vector<double>dar;std::vector<int*>par;//最好不要存放指针,因为new开辟空间,一定不要忘记析构std::vector<int>::reverse_iterator rit = iar.rbegin(); //逆向迭代器int n = iar.size();int* p = iar.data();
}
#endif

运行结果分析:
在这里插入图片描述

容量按照1.5倍增加,容量增容意味着要不断的创建空间,并且不断调用移动构造函数,和不断将对象析构,效率太低,可以直接调用reserve

int main()
{std::vector<PtrInt>ar;ar.reserve(200); //先预留200个空间,效率提高,只申请空间,不创建对象ar.resize(200); //改变存储元素的个数,直接创建200个对象,并且容量为200for (int i = 0; i < 20; ++i){ar.push_back(PtrInt(i));//构建无名对象cout << "Size:" << ar.size() << endl;;cout << "capacity" << ar.capacity() << endl;}
}

迭代器失效,指针指向的对象已经被释放掉

int main()
{std::vector<PtrInt>ar;ar.push_back(PtrInt(1));ar.push_back(PtrInt(2)); ar.push_back(PtrInt(3));ar.push_back(PtrInt(4));ar.push_back(PtrInt(5));std::vector<PtrInt>::iterator it = ar.begin();ar.insert(it, PtrInt(6));  //调用移动赋值函数for (auto x: ar){x.Print();}ar.pop_back();ar.erase(it); //迭代器失效,迭代器面向对象的指针
}

vector作为数组,如何使效率变高?(提前获取vector的大小,预留好空间)

关于List的用法

在相同的空间中,vector的存储密度比List的存储密度大

int main()
{std::list<PtrInt>arlist;for (int i = 0; i < 5; i++){//arlist.push_back(PtrInt(i));arlist.emplace_back(i);}for (auto& x : arlist)  //尽量使用引用,因为使用引用不需要调动拷贝构造{x.Print();}
}

出现内存泄漏的情况

int main()
{std::list<PtrInt*>arlist;for (int i = 0; i < 5; ++i){arlist.push_back(new PtrInt(i));}for (auto& x : arlist){x->Print();  //无法调用析构函数去析构PtrInt}return 0;
}

在这里插入图片描述

解决方案(智能指针)

int main()
{std::list<std::unique_ptr<PtrInt>>arlist;for (int i = 0; i < 10; ++i){arlist.push_back(std::unique_ptr<PtrInt>(new PtrInt(i))); //智能指针,防止内存泄漏}for (auto& x : arlist){x->Print();}return 0;
}

在这里插入图片描述
List的排序算法(当排序量较少是,一般采用快排)

vector和list的区别

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关于迭代器失效
在这里插入图片描述
如果需要高效的随机存取,选择vector(深入理解计算机系统1,6,9章)
场景题目一:页面置换算法,如何设计一个页面置换算法
场景题目二:刷视频,如何让视频刷的更快(生产者消费者模型)
在这里插入图片描述
关于vector里面存放指针的情况
在这里插入图片描述

补充点:关于push_back和emplace_back的区别
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/141022.html

相关文章

电脑删除的文件怎么找回

在日常生活和工作中&#xff0c;我们都会使用电脑来存储各种各样的文件&#xff0c;例如照片、文档、视频等&#xff0c;这些文件对于我们来说都非常重要。然而&#xff0c;在使用电脑的过程中&#xff0c;难免会出现误删除文件的情况&#xff0c;这样的话就需要找回已经删除的…

​LeetCode解法汇总2517. 礼盒的最大甜蜜度

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你一个正整数数组 price &#xff0c;其中 price[i] 表示第 i 类糖果的价格&a…

天宝mn18 amd4800h 自定义显卡显存

开机 长按del 进入bios,依次选择 advanced -> AMD CBS ->NBIO Common Options -> GFX Configuration -> iGPU Configuration -> 直接选择UMA_GAME_OPTIMIZE(大概这个名字,就是游戏优化,实际就是4GB显存,如果你想自定义显存,选择UMA_SPECIFIED,然后第三行有一个…

AMD Athlon64 X2 4000+ AM2 CPU 超频要点

超频第一步 将CPU Frequency修改至290&#xff0c;然后将CPU Vcore选项修改为1.4V/1.45V即可。 电压过高会产生更多发热量&#xff0c;并且烧毁危险增加&#xff0c;并没有尝试1.45V 超频第二步 修改内存频率和内存电压。如果你使用的是DDR2-667内存&#xff0c;超频时建议修改…

酷睿i7 10750H参数 i710750h核显相当于什么显卡

i7-10750H为6核心12线程设计&#xff0c;处理器基本频率为2.60GHz&#xff0c;最大睿频频率为5.00GHz&#xff0c;三级缓存为12MB&#xff0c;热设计功耗45W&#xff0c;制程工艺为14nm。i7 10750H怎么样这些点很重要 http://www.adiannao.cn/dy i710750h核显相当于什么显卡 …

百灵达um2和umc22_百灵达UMC22和百灵达UMC404声卡简评?

原标题&#xff1a;百灵达UMC22和百灵达UMC404声卡简评&#xff1f; 百灵达UMC系列声卡简单介绍&#xff1a;相信大家听到百灵达这个品牌&#xff0c;肯定是有点陌生吧&#xff1f;但是对于他们的产品&#xff0c;百灵达调音台肯定听过。当然小编今天不讲调音台&#xff0c;和大…

HC32F460 SPI DMA 驱动 TFT显示屏

HC32F460 SPI DMA 驱动 TFT显示屏 前言一、驱动代码二、测试代码三、实测效果 前言 嵌入式系统里面&#xff0c;人机界面显示屏这块&#xff0c;不管CPU还是RAM&#xff0c;基本都是很耗资源的&#xff0c;所以在驱动这块&#xff0c;尽量选择DMA去驱动。 这次板子用的性价比…

DA14580简介

简介&#xff1a;Dialog推出的号称全球功率最低、体积最小的SmartBond DA14580蓝牙智能系统级芯片&#xff08;SoC&#xff09;&#xff0c;与竞争方案相比&#xff0c;该产品可将搭载应用的智能型手机配件&#xff0c;或计算机周边商品的电池巡航时间延长一倍。 DA14580简介 D…