顺序容器

  • 所有容器类都有共享公共的接口,不同容器按照不同方式对其进行扩展。每种容器都提供了不同性能和功能的权衡

  • 顺序容器:在添加和删除元素、随机访问元素之间做出折中。关键是连续储存还是非连续储存

vecotr  // 可变大小数组,支持随机访问,尾部操作
deque   // 双端队列, 支持随机访问,头部、尾部操作
list    // 双向链表,只有双向顺序访问,可在任何位置操作
forward_list  //单向链表,只有单向顺序访问, 可在任何位置操作
array       //同数组,不过更安全
string      // 字符串
  • deque定义在头文件<deque>,其他容器,同

  • 有对所有容器都适用的操作,但是这些操作可能对数据类型有要求

vector<noDefault> v1(10, init)  //正确:        提供了元素初始值
vector<noDefault> v1(10)  //error : 没有默认构造函数

所有容器都有的操作

  • 迭代器
//每个容器都定义了多个类型,如
vector<int>::iterator it;
vector<int>::reverse_iterator r_it;
vector<int>::const_iterator c_it;
vector<int>::size_type s;
vector<int>::differance_type d;  //还有 value reference const_reference

//获得迭代器
auto it1 = a.begin();
auto it2 = a.rbegin();  //反向迭代器
auto it3 = a.cbegin();
auto it4 = a.crbegin();
  • 容器定义和初始化
C c;  //默认构造函数

C c1(c2);
C c1 = c2;  //c1初始化为c2的拷贝, 元素类型相同

C c{a, b, c}
C c = {a, b, c}  //c初始化为初始化列表中元素的拷贝, 元素类型相容即可

C c(b, e);   //c初始化为迭代器b和c之间元素的拷贝,左闭右开。  元素类型相容即可(array不适用)
            // list<int>的迭代器可以初始化vector<double>等
//只有顺序容器(不包括array)的构造函数才能接受大小参数
C seq(n)  //包含n个元素, string不适用
C seq(n, t); //seq包含n个初始化为值t的元素
  • array<int, 10> a = {1, 2};同时指定元素类型和大小。运行拷贝和赋值,数组则不行

  • 可以通过迭代器初始化vector<double>,用list<int>

  • 赋值操作:会使得左边容器内部的迭代器、引用和指针失效。swap不会(string和array除外)

c1 = c2;

c = {a, b, c}  //array不适用
swap(c1, c2)   //比拷贝快
c1.swap(c2)

//assign操作不适用于关联容器和array。  很像初始化
seq.assign(b, e)  //迭代器
seq.assign(il)  //初始化为列表il中的元素
seq.assign(n, t)  //n个值为t的元素
  • forward_list是单链表,操作有所不同
fl.before_begin()
fl.insert_after()
fl.erase_after()
emplace_after(p, args)
  • 改变容器大小
list<int> a(10, 42);  //10个int,每个值都是42
a.resize(15);    //后面5个是0
a.resize(25, -1);   //加上10个-1
a.resize(5);   //删除后面的20个元素
  • 容器操作可能使迭代器失效。使用失效的迭代器、引用或指针是严重的运行时错误。添加元素一般保证插入位置之前的元素及其地址不变(顺序存储的情况),后面的则要平移,地址改变。(把迭代器当作指针来看)后面的迭代器对应的对象变化了。如果添加元素后,需要重新分配,则前后的迭代器都失效了。链式存储的情况也可以这么分析

  • vector的容量关联

// 初始化之后,一个一个元素添加。当个数大于容量时,重新分配内存,一般*2
c.reserve(n)  //明确告诉分配至少n个元素的空间
c.capacity()  //容量,一般大于实际的元素数量
c.shrink_to_fit()  //把容量减少为元素

的个数
  • string增加了许多可以用下标代替迭代器的操作,及string和C风格字符数组之间的相互转换

  • 容器适配器:stackququepriority_queue

stack默认基于deque,可以基于listvectors.pop()删除栈顶元素,但不返回
queue默认基于deque,可以基于listvectorq.pop()返回但不删除
priority_queue默认基于vector,可以基于listp_q.pop()返回但不删除

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

推荐阅读更多精彩内容