上篇将了对于struct或是class为何emplace_back要优越于push_back,可是另一些细节没有提及。今天就谈一谈emplace_back造成的引用失效。

直接撸代码了:

#include <vector>
#include <string>
#include <iostream>
using namespace std; int main()
{
vector<int> ivec;
ivec.emplace_back(1);
ivec.emplace_back(ivec.back());
for (auto it = ivec.begin(); it != ivec.end(); ++it)
cout << *it << " ";
return 0;
} //输出:
1 -572662307

尝试1:不直接给emplace_back传递ivec.back():

#include <vector>
#include <string>
#include <iostream>
using namespace std; int main()
{
vector<int> ivec;
ivec.emplace_back(1);
auto &it = ivec.back();
ivec.emplace_back(it);
for (auto it = ivec.begin(); it != ivec.end(); ++it)
cout << *it << " ";
return 0;
}
输出:
1 -572662307

尝试2:不给emplace_back传递引用:

#include <vector>
#include <string>
#include <iostream>
using namespace std; int main()
{
vector<int> ivec;
ivec.emplace_back(1);
auto it = ivec.back();
ivec.emplace_back(it);
for (auto it = ivec.begin(); it != ivec.end(); ++it)
cout << *it << " ";
return 0;
}
输出:
1 1

我们如愿以偿,这时候应该能够得到结论了,ivec.back()返回的是引用,可是这个引用失效了,所以才会输出不对;我们之前也提到过,又一次分配内存会造成迭代器的失效,这里是造成了引用的失效。

再回头看看emplace_back的描写叙述:

if a reallocation happens, all iterators, pointers and references related to this container are invalidated.

Otherwise, only the end iterator is invalidated, and all other iterators, pointers and references to elements are guaranteed to keep referring to the same elements they were referring to before the call.

进一步。

尝试3:避免emplace_back引起又一次分配内存:

#include <vector>
#include <string>
#include <iostream>
using namespace std; int main()
{
vector<int> ivec;
ivec.reserve(4);
ivec.emplace_back(1);
ivec.emplace_back(ivec.back());
for (auto it = ivec.begin(); it != ivec.end(); ++it)
cout << *it << " ";
return 0;
}
输出:
1 1

可是这个时候问题来了,假设不使用emplace_back而改用push_back呢?

#include <vector>
#include <string>
#include <iostream>
using namespace std; int main()
{
vector<int> ivec;
ivec.push_back(1);
ivec.push_back(ivec.back());
ivec.push_back(ivec.back());
ivec.push_back(ivec.back());
for (auto it = ivec.begin(); it != ivec.end(); ++it)
cout << *it << " ";
return 0;
}
//输出:
1 1 1 1

为什么使用push_back就不失效呢?

最新文章

  1. 用Kotlin创建第一个Android项目(KAD 01)
  2. 手动建库时一个小错误:ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
  3. CentOS7:配置SVN服务器
  4. [20160730]while 条件的死循环和正常循环对比
  5. php函数的可变参数
  6. 前端调试效率低?试试这10个“Chrome开发者工具”使用技巧
  7. jQuery中$(function() {});问题详解
  8. oracle常用SQL语句(汇总版)
  9. The EF 6.x DbContextGenerator templates are not available for VS2010
  10. C#开发学习——常用的正则表达式
  11. php封装+租房子练习题
  12. table 表格的增删和修改
  13. Cocoa包管理器之Carthage详解及CocoaPods中心化+Carthage的二进制化
  14. Beta冲刺4/7
  15. MySQL查询本周、上周、本月、上个月份数据的sql脚本
  16. Lucene的深入
  17. phpcms 路由配置
  18. Linux_(3)Shell编程(上)
  19. python技巧 is 和 ==
  20. js数据结构之链表(单链表、双向链表、循环链表)

热门文章

  1. windows ubuntu bcdeditor
  2. 框架开发之Java注解的妙用
  3. java将很长的一条sql语句,自动换行输出(修改版)2019-06-01(bug未修复)
  4. mac 下安装python pil
  5. 【东软实训】SQLselect及其相关操作
  6. 下载kaggle数据集,验证手机号
  7. 2.10.2 section元素
  8. docker centos7 配置和宿主机同网段IP
  9. JS中的同步异步问题
  10. 配置jdk环境变量和配置的作用