vector&list[GeekBand]

本文介绍vector和list的用法、适合的场景以及在无法估算实际业务场景中vector和list的代价情况下如何使用vector和list.

1 用法

vector和list是C++标准库提供的两种容器。其实,这两种容器与我们学过的数据结构中的数组和链表是一样的。只不过,标准库将其实现成模板让其更加的通用。下面简要介绍下C++11新增的几种方法。其他内容见张老师的课件。
1.1 构造函数
C++11支持列表初始化,因此在容器的构造函数中新增了带列表初始化的构造函数。函数声明如下:
C c{a, b, c}
有了这个构造函数,我们就可以使用如下的方式构造vector/list:
vector<int> ivec{1, 2, 3, 4, 5};
list<int> ilst{5, 6, 7, 8, 9};
在C++11以前,我们要使用下面的方式来达到相同的目的:

vector<int> oivec;
for (int i = 0;i < 5;i++)
    oivec.push_back(i);
//或者
int intArray[] = {1, 2, 3, 4, 5};
vector<int> oivec1(intArray, intArray + 5);

1.2 赋值
得益于列表初始化,复制也支持列表的赋值。声明为c1 = {e1, e2, e2}。用法与构造函数类似。
1.3 添加/删除
插入/删除新增的接口如下:

c.emplace(inits) //使用inits中的元素构造一个c元素的对象,并插入到c中
c.emplace_back(inits)
c.emplace_front(inits)

一般的,我们插入元素会使用c.insert(args)。其中args是c中元素的对象。当调用insert的成员函数时,我们将元素类型的对象传递给容器,这些容器被拷贝到容器中。当我们使用emplace时,我们将参数传递给元素的构造函数。emplace直接使用这些元素构造对象并保存在容器中。使用示例如下:

vector<complex<int> > cvec; /*定义一个存储complex对象的数组*/
complex<int> c(1, 2);
cvec.insert(cvec.begin(), c);       /*C++11之前使用的调用方式*/
cvec.emplace(cvec.begin(), 2, 3); /*c++11新增的调用方式,直接传元素的参数给emplace,emplace在调用complex来构造对象*/

2 适合场景

本节介绍vector&list的使用场景。一般vector会实现成数组的方式,即分配一段连续的内存空间在存放数组元素,而list会实现成双向链表,便于双向访问。因此,vector和list也分别具有数组和链表的优缺点。
vector的优缺点:
1.优点
-提供高效、灵活的内存管理;
-支持随机访问,访问速度非常快
2.缺点
+在数组中间插入元素需要移动后续的元素,因此插入数组很慢
+插入数据时可能伴随大量内存分配
list的优缺点:
1.优点
+list一般实现为链表,节点与节点之间是通过指针链接的,因此在list中插入/删除元素很快,只需要常量的时间。
2.缺点
+不支持随机访问,访问list内元素的速度与list的元素数量正相关。
从上面的介绍中,不难发现vector和list各自适合的场景。如果我们的业务中需要快速、随机的访问容器中的元素并且对向数组中插入数据的需求不高的话,那vector是很好的选择;如果业务对快速插入的需求高,对随机访问元素的要求低的话,那就可以选择list。当然,除此之外,还有些基本的原则:
1.通常建议使用vector,除非有很好的理由。
2.如果程序元素小且多,空间的额外开销很重要的话,不要使用list。

3 业务场景不明晰是如何使用vector和list

在实际开发过程中,可能无法正确评估vector/list对系统性能的影响,但是有需要vector和list的一些公有操作,如果插入,查询等。这时候可以定义一个适配器ListAdpter,该适配器组合vecotr/list并定义一套vector/list的公有接口。然后,我们的程序通过调用ListAdpter中的操作,进而对程序屏蔽底层的实现。然后,在对系统进行压力测试,评估出vector/list对系统的影响,而且抉择出启用哪种容器。

4 参考

1.cpp primer 5th edition

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,516评论 1 51
  • 标签(空格分隔): STL 运用STL,可以充分利用该库的设计,让我为简单而直接的问题设计出简单而直接的解决方案,...
    认真学计算机阅读 1,480评论 0 10
  • 前言: 详细介绍: List:元素有放入顺序,元素可重复Map:元素按键值对存储,无放入顺序Set:元素无放入顺序...
    YBshone阅读 8,652评论 0 17
  • 湖南的冬天经常都很冷。这是一种温度不太低,一般都能在0°以上,但比北方零下10°还冷的湿冷和阴冷。 我午睡...
    鄙人姓贺阅读 396评论 0 0
  • 最近有本新书《好好学习》,作者成甲在书里说,我们只有不断反思过去的经历,提炼精华,指导未来,才能提升自己的学习能力...
    小丫屠阅读 277评论 0 0