C++11之emplace_back

本文探讨了C++11中emplace_back与push_back的区别,通过具体代码示例,展示了emplace_back如何通过直接在容器内部构造对象,避免了不必要的临时对象创建和拷贝,从而提高效率。
部署运行你感兴趣的模型镜像

      在之前的学习中,了解到在STL中,进行插入元素的时候,有insert和push两种选择方式,而在有了右值引用和移动语义的时候,就提出了更高效的插入方法:emplace_back,下面来介绍一下C++11新特性中的emplace_back是怎样的:

先来看一下代码来分析:

#include <vector>
#include <string>
#include <iostream>
using namespace std;
struct Youbain
{

	string _contry;
	string _privence;
	int _number;
		
	Youbain(string&& contry, string&& privence, int number)
		:_contry(std::move(contry)), _privence(std::move(privence)), _number(number)
	{
		cout << "转移构造" << endl;
	}
	Youbain(Youbain&& y)
		:_contry(std::move(y._contry)), _privence(std::move(y._privence)), _number(y._number)
	{
		cout << "转移拷贝" << endl;
	}
	Youbain& operator = (const Youbain& y) = default;
}

int main()
{
	vector<Youbain> el;
	el.emplace_back("China", "Shannxi", 610000);
	el.push_back(Youbain("China", "Beijing", 10000));
}

在执行emplace_back的时候,只调用了转移构造函数,在插入的时候直接构造,效率更高,减少额外空间的开辟

在执行push_back的时候,调用了构造和拷贝构造函数,因为在使用push_back()向容器中加入一个右值元素(临时对象)时,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题就是临时变量申请资源的浪费。 

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

C++11中,`threads.emplace_back` 是 `std::vector<std::thread>` 容器的一个成员函数,用于在容器的末尾直接构造一个新的 `std::thread` 对象。与 `push_back` 不同,`emplace_back` 可以避免不必要的对象复制或移动操作,因为它是直接在容器的内存位置上构造对象。 ### 使用方法 `emplace_back` 的基本语法如下: ```cpp template< class... Args > reference emplace_back( Args&&... args ); ``` 这里的 `Args` 是传递给 `std::thread` 构造函数的参数。这些参数可以是线程要执行的函数,以及该函数所需的参数。 ### 示例代码 ```cpp #include <iostream> #include <vector> #include <thread> // 线程要执行的函数 void worker(int id) { std::cout << "Thread " << id << " is running." << std::endl; } int main() { std::vector<std::thread> threads; // 使用 emplace_back 创建并启动线程 for (int i = 0; i < 5; ++i) { threads.emplace_back(worker, i); } // 等待所有线程完成 for (auto& thread : threads) { if (thread.joinable()) { thread.join(); } } std::cout << "All threads have finished." << std::endl; return 0; } ``` ### 代码解释 1. **定义线程函数**:`worker` 函数是线程要执行的任务,它接受一个整数参数 `id`,并输出线程的编号。 2. **创建线程容器**:`std::vector<std::thread> threads` 用于存储多个线程对象。 3. **使用 `emplace_back` 创建线程**:在 `for` 循环中,使用 `emplace_back` 直接在 `threads` 容器的末尾构造新的 `std::thread` 对象。`emplace_back` 的参数依次是线程要执行的函数 `worker` 和该函数所需的参数 `i`。 4. **等待线程完成**:使用 `join` 方法等待所有线程执行完毕。`join` 方法会阻塞当前线程,直到对应的 `std::thread` 对象所代表的线程执行结束。 ### 注意事项 - **异常安全**:如果在 `emplace_back` 过程中抛出异常,已经构造的线程对象可能会导致资源泄漏。因此,在使用 `emplace_back` 创建线程时,需要确保在异常情况下能够正确处理线程资源。 - **线程管理**:在使用完线程后,需要确保调用 `join` 或 `detach` 方法来管理线程的生命周期,避免程序崩溃或资源泄漏。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值