初步接触c++ primer,被书中各种乱七八糟的东西搞得头昏脑涨。数组还好点,毕竟以前的一些语言也介绍过,那突然又冒出了一个容器。
大多数像我这种初级者而言,
1、实在搞不明白既然有数组了,数组也可以存放对象,那还要容器干嘛?
既然抱着存在就有其合理性的角度来说,那既然容器存在了,就肯定有它相对于数组的好处。看到书中巴拉巴拉一大片,一会这个操作一会那个操作,又蒙了。权当自己的理解和学习方法,记录下以防止自己忘记。
借用网友对数组与容器的比较来看:(1)创建方式:数组必须指定其大小
容器不必指定,可以动态的改变其大小。(这个地方是不是让我们想起来了什么?new和delete?对,就是它,new和delete 明明可以动态的创建数组或者对象啊)
(2)存储方式不同:
·数组在内存空间上是连续存储的;
而容器中顺序容器vector和deque是连续存储的(deque与vector不同的是它支持高效地在其首部插入和删除元素),但list是链式存储的。
(3)访问效率:
访问数组元素时可根据数组下标直接访问相应位置的元素;而容器中顺序容器vector和deque支持对元素的随机访问(也支持下标访问元素,或at()函数,如ivec.at(5)返回容器ivec中第6个元素),但list不支持。
2、容器有了那我们对容器要干什么?
这部分其实简单的来说,我们知道有容器了,也存放了对象了,那我们肯定要对容器进行操作啊。这些操作就是我们要学的:
如同数组一样我们队容器要从哪些方面学习呢?以顺序容器而言(目前只看到了顺序容器)
(1)定义 :如同其他的变量一样,我们要定义吧。
(2)操作:有了容器,那肯定都得对它进行操作啊,对容器操作什么呢?
这么想,容器里面是放东西的,那放东西,那就会有时候去取东西,有时候再向里面放东西。这就有了向容器中删除元素和添加元素。那就是用erase的操作啊。
取东西的时候和放东西的时候,有时候我需要把他们放在特定的地方或者从特定的地方去取一个东西,于是就有了在容器中的指定位置添加元素或者删除元素。
如果我想拿好几个东西或者放进去好几个东西,那就有了插入或删除一段元素。
有时候我想知道这个容器里面到底有多少东西?那怎么办?那我就看当前容器的大小呗。那就有了容器大小的操作。
我有一筐水果,你有一筐水果,你是不是想知道谁的水果筐里的水果多啊?那就比较下两个容器的大小吧
取东西的时候,如果里面都没有东西了,那还取什么?于是就有了begin与end。
有一天你大姨妈来了,你想把所有的东西都扔掉,那咋办?果断删除容器里面的所有元素啊。大姨妈来的时候大脑是不清晰的,你会想着我获取了begin,再获取了end,然后我就循环吧,用erase吧。但是大姨妈来了,都那么烦了,你还用erase啊,还是用clear吧。这个方便。
大姨妈没来时:slist.erase(slist.begin(),slist.end());
大姨妈来临时:slist.clear();
小的时候,谁都想拥有与小伙伴一样的东西,东西你不一定喜欢,但是就是要一样的。那咋办,照着一样的买呗。照着一样的买?那是copy,那就是一份东西存在两个了,不好玩。要的就是独一无二。最好的办法就是“抢过来”。可是你的兜里已经放不下了,你抢过来了放在哪呢?
于是就有了c1=c2,BUT你必须把你自个儿的口袋清空(删除容器C1的元素)了的东西,你的口袋也要和他口袋一样(类型要一样)。
具体操作:
c1 = c2;
其实抢只是一个途径而已,对于关系比较好的小伙伴而言,我们是可以交换的嘛,交换的话合理性更加的好,也不会浪费口袋的资源。于是就有了C1.swap(C2)。从你想获得小伙伴角度的速度来说也要快很多吧。你去抢,就会引发碰撞,那中途得浪费多少时间啊。所以说swap的执行速度会更快。
具体操作:
c1.swap(s2);
那还有一个赋值操作:assign,我实在没想到用什么样的故事来更加形象的表述了。你有一个5个暧昧的对象,你兄弟也有5个暧昧的对象。你现在不想跟你暧昧的对象暧昧了,你想跟你兄弟暧昧的对象暧昧。于是你就踹开了你暧昧的对象,把你兄弟暧昧的对象拉过来。这事儿就这么解决了。
具体操作
c.assign(b,e); //把b号到e号的暧昧对象全部拿过来
c.assign(n,t); //很缺德的用了“克隆”这个技术克隆了n个t姑娘,你全部拿过去了
迭代器这么拗口干嘛不叫指向器呢?----容器与迭代器的基友关系
但是C++中问题不是想你抢来抢去就把这个问题解决了,容器的出现和迭代器是分不开的啊。哦买噶,迭代器是不是木有介绍?先这么理解吧,迭代器就是指针,指向的你暧昧的1、2、3、4.。。。对象的,就是你在电话本里存的1号暧昧对象,2号暧昧对象。。。。。
当C1=C2和assign的时候,是不是要把你自个的口袋和暧昧对象全删掉腾出位置啊?电话本都要删除了,那还指向个屁啊?所以说赋值和assign操作会使得左边的所有迭代器失效。
swap:是不是没有删掉啊,没有删掉那就还指着的,那就是迭代器木有失效。
(未完待续。。。。。)