当前位置: 首页 > news >正文

适合大学生浏览的网站网站设计与建设

适合大学生浏览的网站,网站设计与建设,横沥做网站的电话,网站管理助手建站教程小解List的使用【C】 一. List1.1. 与vector的不同1.2 与vector的使用不同1.2.1 迭代器失效1.2.2. insert1.2.3 erase1.2.4 sort1.3. 其他接口 补充迭代器容器与迭代器的关系迭代器的类型 一. List 学习了STL,也已经到了List的内容 因为List与string以及vector比起…

小解List的使用【C++】

  • 一. List
    • 1.1. 与vector的不同
    • 1.2 与vector的使用不同
      • 1.2.1 迭代器失效
      • 1.2.2. insert
      • 1.2.3 erase
      • 1.2.4 sort
      • 1.3. 其他接口
  • 补充迭代器
    • 容器与迭代器的关系
    • 迭代器的类型

一. List

学习了STL,也已经到了List的内容
因为List与string以及vector比起来还是有很大不同的,所以这里稍微除了一篇小博客主要来讲解一下
相对于vector以及string,List中比较特殊的部分。

1.1. 与vector的不同

我们再学习这个List之前:
大部分人应该都已经知道list的底层实际上是:双向带头循环链表
这个其实以前博主再博客中实现过。

这里也不深究

string和vector实际上本质是顺序表

这两个类型的最大区别就是:
vector在内存中相当于动态开辟的数组,地址是连续的

链表中的节点则不是连续的,在内存中表现的是断开的,不连续的形式

所以vector的区别和使用上的区别也都是围绕着这个展开的。

与string有较大的不一样,因为空间不连续

1.2 与vector的使用不同

这里主要挑出来几个常用的功能
来体验一下vector与list的区别。

1.2.1 迭代器失效

还记得在vector中的迭代器失效吗

就是当使用迭代器进行insert和erase后,
重新使用迭代器对象进行操作
因为迭代器指向的位置虽然没变,但是指向的值却已经发生了变化。
在vs编译器下,直接限制了用户对erase与insert后的指针对象的使用。

#include<iostream>
#include<vector>
#include"vector.h"
int main()
{std::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);std::vector<int>::iterator begin = v1.begin();v1.erase(begin);while (begin != v1.end()){std::cout << *begin;begin++;}
}

就是上面的情况。

但是我们把目光转向list,看看list中是否存在迭代器失效的结果。

1.2.2. insert

这里我们直接进行测试把

int main()
{vector<int> v1;vector<int>::iterator it = v1.begin();v1.insert(it, 1);v1.insert(it, 2);
}

这里先用vector进行测试
很明显是行不通的,因为it被连续调用了两次。

在这里插入图片描述

这里就用list进行测试:
在这里插入图片描述

在这里插入图片描述

这里能发现并没有报错。

这里其实我们细想一下也能明白

list使用insert时候
list中的地址指向的值没有发生变化
因为他们本身就是不连续的,数据插入后,他们指针指向的位置依旧还是原来的值。

所以不会出现和vector一样的情况——移动后,前面的元素,会取代原来的值所以指针指向的值就发生了变化。

所以用insert不会发生迭代器失效的问题。

这里又要提出一个小问题:
因为vector的地址是连续的,在insert中可以直接用:

v1.insert(it+5,2);

表示在迭代器的+5的位置处进行插入

这里vector能这么用,是因为vector的迭代器能支持加减,因为vector的地址是连续的

但是list的话因为地址不一样,所以是不是可能就不行了。

这里我们来试一下
在这里插入图片描述

这里就非常明显的报错了。

所以我们list想在迭代器后面进行插入就要自己让迭代器去++;

比如这里:
想要到迭代器后的第三个位置进行插入

std::list<int>::iterator it=s1.begin();
for(int i=0;i<3;i++)
{it++;
}

1.2.3 erase

其实erase这里不用实验。想想就能知道了

erase的作用是删除节点。
那节点都删除了,迭代器指向的指针位置肯定也消失了。
所以这里就不实验了,毫无疑问。

那问题应该是怎么解决:
其实这里和vector里的一样:
it=it.erase();

it会自带返回迭代器
返回的指向对象正是迭代器删除的对象的下一个指向对象。

1.2.4 sort

我们知道在算法中有一个qsort算法。

但是在list中,list自带了一个qsort接口,方便用户进行排序。

但是这里我们并不提倡用这个qsort

因为:
sort():
算法中的sort效率远高于list的sort效率
数据量差的越多,效率差距越大

因为算法中的sort用的是快速排序

而因为list中的地址不是连续的,所以并不能用快速排序,只能用归并排序进行实现

这里我们能来进行测试以下:

这里把测试函数塞进来:

void test2()
{int N = 1000000;//测试的数字的多少std::vector<int>v1;//添加随机值给vectorfor (int i = 0; i < N; i++){auto s = rand();v1.push_back(s);}//给list添加随机值std::list<int> l1;for (int i = 0; i < N; i++){auto s = rand();l1.push_back(s);}//排序list并记录时间int begin1 = clock();l1.sort();int end1 = clock();//排序vector并记录时间int begin2 = clock();sort(v1.begin(), v1.end());int end2 = clock();std::cout << "vector " << end2 - begin2 << std::endl;std::cout << "list " << end1 - begin1 << std::endl;
}

在这里插入图片描述
这里我们能看到list和vector的效率差距还是十分大的。

所以还是不推荐用list的sort的

那我们想要排序list中的数怎么办。

我们可以将list中的数字拷贝进vector中,然后再vector排序完了后,赋值给list

void test3()
{int N = 1000000;std::vector<int>v1;for (int i = 0; i < N; i++){auto s = rand();v1.push_back(s);}std::list<int> l1;for (int i = 0; i < N; i++){auto s = rand();l1.push_back(s);}int begin1 = clock();sort(v1.begin(), v1.end());int end1 = clock();int begin2 = clock();std::vector<int>v2;for (auto i : l1){v2.push_back(i);}sort(v2.begin(), v2.end());size_t i = 0;//将vector赋值给listfor (auto& z : l1){z = v2[i++];}int end2 = clock();std::list<int> l2;for (int i = 0; i < N; i++){auto s = rand();l2.push_back(s);}int begin3 = clock();l2.sort();int end3 = clock();std::cout << "vector " << end1 - begin1 << std::endl;std::cout << "list_good " << end2 - begin2 << std::endl;std::cout << "list " << end3 - begin3 << std::endl;}

1.3. 其他接口

这里的其他接口就不进行演示了
这里贴个网址自己去使用即可:
List的其他接口

补充迭代器

这里因为vector与list有许多的不同。

所以他们的迭代器有很大的不同,这里就补充一下迭代器。

容器与迭代器的关系

我们都知道:

容器使用来存储数据的

算法是用来处理数据的。

而迭代器是用来链接容器和算法之间的桥梁。

有了迭代器,算法就可以通过访问迭代器改变容器中的数据。

所以对于迭代器来说要通过容器的性质来进行设计。
容器的不同会导致迭代器的类型也不同

迭代器的类型

在这里插入图片描述

这里的容器种类不同,迭代器的种类也不同。

迭代器的种类不同,我们能看到他们支持的运算符种类也不同。

http://www.mnyf.cn/news/36149.html

相关文章:

  • 两学一做考试答案网站网站seo怎么操作
  • 做设计哪个网站可以接单cps广告是什么意思
  • 可以自己做网站服务器不自媒体平台注册入口
  • 国外做微课的网站成都百度百科
  • 做金馆长网站网站站长之家ping检测
  • google官方网站注册怎么自己做一个网页
  • 安装wordpress 空白页深圳seo优化公司
  • wordpress建站菜单栏 二级标题手机seo排名
  • 怎么在网站上做游戏代练广告网址
  • 做ppt赚钱网站模板免费下载网站
  • 手机特殊网站爱链网中可以进行链接买卖
  • 定制网站制作服务商泰安百度推广代理
  • 完整网站开发流程智慧软文网站
  • 广州营销型网站建设公司哪家靠谱网络营销的特点是什么?
  • wordpress推广系统太原网站建设优化
  • 上海网站 备案建立网站平台需要多少钱
  • 搭建网站是seo的入门搜索百度网页版
  • 外包网站开发百度网站优化软件
  • 成都中小企业申请网站虞城seo代理地址
  • 桥梁建设网站seo外包资讯
  • 网站安全怎么做惠州seo关键字优化
  • 肇庆市网站建设徐州seo网站推广
  • 外贸公司有必要建设网站吗得物app的网络营销分析论文
  • 做网站编程时容易遇到的问题营销策划公司名称
  • 一个网站用多个域名优化设计答案四年级上册语文
  • 乒乓球网站建设目标竞价推广托管公司价格
  • 做网站维护有前途吗百度推广找谁做靠谱
  • 专业电子科技网站建设百度推广怎么做
  • 淘宝网站建设的目标是什么意思seo论坛站长交流
  • 快速搭建网站工具百度客服电话