C++11 容器emplace方法刨析

  • 如果是直接插入对象 push_back()emplace_back()没有区别
  • 但如果直接传入构造函数所需参数emplace_back()会直接在容器底层构造对象,省去了调用拷贝构造或者移动构造的过程
class Test
{
public:
	Test(int a)
	{
		cout<<"Test(int)"<<endl;
	}
	Test(int a,int b)
	{
		cout<<"Test(int,int)"<<endl;
	}
	Test(const Test&)
	{
		cout<<"Test(const Test&)"<<endl;
	}
	~Test()
	{
		cout<<"~Test()"<<endl;
	}
	Test(Test&&)
	{
		cout<<"Test(Test&&)"<<endl;
	}
};
int main()
{
	Test t1(10);//Test(int)
	vector<Test> v;
	v.reserve(100);
	cout<<"========1=========="<<endl;
	//直接插入对象,两个没有区别 
	v.push_back(t1);//Test(const Test&) 
	v.emplace_back(t1);//Test(const Test&)
	cout<<"=========2========="<<endl;
	//直接插入对象,两个没有区别 
	v.push_back(Test(20));//Test(int)  Test(Test&&) ~Test()
	v.emplace_back(Test(20));//Test(int)  Test(Test&&) ~Test()
	
	cout<<"=========3========="<<endl;
	//给emplace传入Test对象构造所需的参数,直接在容器底层构造对象即可  
	v.emplace_back(20);//Test(int)
	v.emplace_back(30,40);//Test(int,int)
	cout<<"=========4========="<<endl;
	
	/*
	map<int,string> mp;
	m.insert(make_pair(10,"zhangsan"));//构造临时对象 调用右值引用拷贝构造 析构临时对象
	m.emplace(10,"zhangsan") ;//在map底层直接调用普通构造函数,生成一个pair对象即可 
	*/
	return 0;
}

在这里插入图片描述
底层实现:

//空间配置器 
template<typename T>
struct Allocator
{
	T* allocate(size_t size)//负责内存开辟 
	{
		return (T*)malloc(sizeof(T)*size);
	}
	
	template<typename... Types>
	void construct(T *ptr,Types&&... args)//负责构造 
	{
		new (ptr) T(std::forward<Types>(args)...);//定位new  在指定的内存上 构造一个值为val的对象,会调用 T类型的拷贝构造 
	}
};

template<typename T,typename Alloc = Allocator<T>>
class vector
{
public:
	vector():vec_(nullptr),size_(0),idx_(0){}
	
	void reserve(size_t size)
	{
		vec_ = allocator.allocate(size);
		size_ = size; 
	}
	
	template<typename Type>
	void push_back(Type&& val)
	{
		allocator.construct(vec_+idx_,std::forward<Type>(val));
		idx_++;
	}
	
	template<typename... Types>
	void emplace_back(Types&&... args)
	{
		allocator.construct(vec_+idx_,std::forward<Types>(args)...);
		idx_++;
	}
private:
	T* vec_;
	int size_;//内存大小 
	int idx_;
	Alloc allocator;//空间配置器 
};

相关推荐

  1. C++ 之emplace_back 和 push_back

    2024-07-20 03:14:02       29 阅读
  2. 动态规划思想案例

    2024-07-20 03:14:02       40 阅读
  3. Nginx内存池源码

    2024-07-20 03:14:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 03:14:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 03:14:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 03:14:02       45 阅读
  4. Python语言-面向对象

    2024-07-20 03:14:02       55 阅读

热门阅读

  1. Linux C++ 058-设计模式之解释器模式

    2024-07-20 03:14:02       21 阅读
  2. Swagger生成Api文档的增强解决方案--knife4j

    2024-07-20 03:14:02       21 阅读
  3. 虫虫老师---义务教育核心课程改革

    2024-07-20 03:14:02       14 阅读
  4. 面试题 16.07. 最大数值

    2024-07-20 03:14:02       16 阅读
  5. 【基础算法】排序

    2024-07-20 03:14:02       14 阅读
  6. 说说Vue2.0和Vue3.0有什么区别

    2024-07-20 03:14:02       17 阅读
  7. kubernetes学习日志(六)

    2024-07-20 03:14:02       12 阅读
  8. JWT身份验证、授权介绍、应用场景和示例代码

    2024-07-20 03:14:02       18 阅读
  9. VUE3【实用教程】(2024最新版)

    2024-07-20 03:14:02       19 阅读
  10. LLM推理需要占用多少显存

    2024-07-20 03:14:02       16 阅读
  11. 应届硕士职业生涯规划

    2024-07-20 03:14:02       16 阅读