C++primer 顺序容器(2)

接上一篇,我们再来谈谈顺序容器的成员函数:

c.insert(pos,elem);//即在pos位置插入元素elem

程序执行过程是将元素类型的对象拷贝到容器中去的。其中push系列的函数执行机理也大致如此

但是c++11新标准中引入了3个新成员(emplace_front、emplace、emplace_back)这三个成员对应原来的老成员分别是(push_front、insert、push_back)

那么新老成员之间有啥区别呢?

新成员不像老成员是将对象拷贝至容器中,而是调用元素类型的构造函数。

比如有这么一个类 BOOK

有这么个构造函数BOOK(int ,int,char){.....}

现在vector<BOOK>c

c.emplace_back(100,20,'a');//就是把这个元素压入序列中。

执行过程大致如下,首先使用BOOK的构造函数,创建了一个BOOK对象,然后把创建的这个对象直接压入尾部。

到这就有一个注意点,既然新成员是要找构造函数帮忙,那么程序正确的前提必须是能够准确找到构造函数,也就是说emplace函数的参数必须与元素类型的构造函数相匹配。

值得注意的是vector与string只能进行尾部操作,也就是没有直接对首元操作的函数,就是没有front系列的~这点很容易理解,因为这两个序列都是单向的。

我们在选择容器的时候要根据各自容器的特点进行选择,简单归纳为:

如果你要频繁访问某一元素,那么vector久很合适,但要是想频繁增加或者删除元素,那么list就好一点,这个后面会讲。

有很多读者跟我一样,如果我两个优势都想满足怎么办?

那么可以创建2个容器,2个容器的元素一模一样,用适合的容器处理完之后再物归原主,那么问题来了,如何进行两个不同容器的元素拷贝?

这个成员函数中也有能完成这项功能,但是这个前提是这两个容器的类型和其元素类型必须匹配。也就是你们容器类型必须一样(大致就是禁止与外族通婚的意思)

这不扯淡么,完全不能满足我们

这个时候我们可以用迭代器来做中间人,在传递参数

比如

vector<const char*>b={"a","b","c"};

list<string>a(b.begin(),b.end());//就是把b全部给了a

就这样凑成了一段姻缘哈哈~









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值