当前位置: 首页 > wzjs >正文

北京seo方法怀柔网站整站优化公司

北京seo方法,怀柔网站整站优化公司,北京文化墙设计制作,东莞市住房和城乡建设局门户网站在 C 中,push_back 和 emplace_back 都是 std::vector 提供的成员函数,用于向向量末尾添加元素,但它们在用法和实现上有一些关键区别。以下是详细说明: 1. 基本功能 push_back:将一个已经构造好的对象(或…

在 C++ 中,push_backemplace_back 都是 std::vector 提供的成员函数,用于向向量末尾添加元素,但它们在用法和实现上有一些关键区别。以下是详细说明:

1. 基本功能

  • push_back:将一个已经构造好的对象(或值的副本)添加到向量的末尾。
  • emplace_back:直接在向量的末尾构造一个对象,避免额外的拷贝或移动操作。

2. 参数传递

  • push_back:接受一个完整的对象(可以是右值或左值)。如果传入的是左值,会发生拷贝;如果传入的是右值,会发生移动。
  • emplace_back:接受对象的构造函数参数,直接将这些参数转发给对象的构造函数,在容器内就地构造对象。

3. 性能差异

  • push_back:因为需要传入一个构造好的对象,可能会涉及额外的拷贝或移动开销。
  • emplace_back:通过就地构造,避免了不必要的拷贝或移动,通常更高效。

4. 代码示例

#include <vector>
#include <string>
#include <iostream>struct Person {std::string name;int age;Person(const std::string& n, int a) : name(n), age(a) {std::cout << "Constructor called for " << name << "\n";}Person(const Person& other) : name(other.name), age(other.age) {std::cout << "Copy constructor called for " << name << "\n";}
};int main() {std::vector<Person> vec;// 使用 push_backPerson p1("Alice", 25);vec.push_back(p1);  // 拷贝构造std::cout << "----\n";// 使用 push_back 配合 std::movevec.push_back(std::move(p1));  // 移动构造std::cout << "----\n";// 使用 emplace_backvec.emplace_back("Bob", 30);  // 直接构造,无拷贝或移动return 0;
}
输出:
Constructor called for Alice
Copy constructor called for Alice
----
Copy constructor called for Alice  // 注意:这里假设移动被优化为拷贝
----
Constructor called for Bob
  • push_back(p1):触发了一次拷贝构造,因为 p1 是左值。
  • push_back(std::move(p1)):通过 std::move 触发移动构造(如果类支持移动语义)。
  • emplace_back("Bob", 30):直接在向量内存中构造 Person,只调用一次构造函数。

5. 适用场景

  • push_back:适合已有对象需要添加到容器的情况,或者你明确想传递一个完整的对象。
  • emplace_back:适合需要高效构造对象的情况,尤其是当对象构造成本较高或希望避免拷贝时。

6. 注意事项

  • emplace_back 不一定总是更快:如果传入的参数本身需要构造临时对象(例如 emplace_back(std::string("test"), 42)),编译器可能仍会生成临时对象,此时性能可能与 push_back 相近。
  • push_back 更直观:代码可读性上,push_back 更常用且易懂。

假设emplace_back的是一个对象,会如何, 先说答案,会触发拷贝构造函数或移动构造函数!

如果你将一个已经构造好的对象传入 emplace_back,它的行为会与预期有所不同,因为 emplace_back 的设计初衷是接受构造函数的参数并在容器内就地构造对象,而不是直接处理完整的对象。让我们具体分析这种情况:

传入对象情况说明

当你尝试将一个完整的对象传入 emplace_back 时,C++ 编译器会将其视为一个参数,并尝试用这个对象调用目标类型的构造函数。这可能会导致以下几种情况:

  1. 隐式转换或构造:如果目标类型可以用传入的对象构造(比如通过拷贝构造函数或移动构造函数),emplace_back 会在容器内调用相应的构造函数。
  2. 编译错误:如果目标类型的构造函数无法接受这个对象,代码将无法编译。

示例代码

#include <vector>
#include <string>
#include <iostream>struct Person {std::string name;int age;Person(const std::string& n, int a) : name(n), age(a) {std::cout << "Constructor called for " << name << "\n";}Person(const Person& other) : name(other.name), age(other.age) {std::cout << "Copy constructor called for " << name << "\n";}
};int main() {std::vector<Person> vec;// 创建一个对象Person p1("Alice", 25);// 使用 emplace_back 传入对象vec.emplace_back(p1);  // 注意这里传入的是完整的对象return 0;
}
输出:
Constructor called for Alice
Copy constructor called for Alice

分析

  • vec.emplace_back(p1) 中,p1 是一个已经构造好的 Person 对象。
  • emplace_back 会将 p1 作为参数传递给 Person 的拷贝构造函数,在向量内部构造一个新对象。
  • 结果是:仍然会触发一次拷贝构造,而不是直接使用 p1

这与 push_back(p1) 的行为类似,因为两者最终都会调用拷贝构造函数。区别在于:

  • push_back(p1) 是明确地将 p1 拷贝(或移动)到容器中。
  • emplace_back(p1) 是将 p1 作为参数,间接触发拷贝构造。

如果传入右值对象

如果传入的是右值(例如通过 std::move),emplace_back 会调用移动构造函数:

vec.emplace_back(std::move(p1));  // 触发移动构造
输出(假设有移动构造函数):
Constructor called for Alice
Move constructor called for Alice

与预期设计的差异

emplace_back 的优势在于直接使用构造函数参数(例如 emplace_back("Alice", 25)),从而避免额外的拷贝或移动。

总结

  • 效率emplace_back 通常更高效,因为它避免了拷贝或移动。但是如果是添加的对象,还是会触发拷贝或者移动(右值)
  • 灵活性emplace_back 直接用构造函数参数,push_back 需要现成的对象。
  • 选择建议:优先考虑 emplace_back,除非你已经有构造好的对象需要传入。

文章转载自:

http://Mvvq5Cqy.LLfwg.cn
http://1DT76S27.LLfwg.cn
http://6SMLYv9c.LLfwg.cn
http://AQZg5kn4.LLfwg.cn
http://bmACHmoG.LLfwg.cn
http://vg0qCWxW.LLfwg.cn
http://qZ6L5YTX.LLfwg.cn
http://pt7hAJ4E.LLfwg.cn
http://cysfj6EX.LLfwg.cn
http://S54RT0Ig.LLfwg.cn
http://Npmxfexs.LLfwg.cn
http://46gYJydl.LLfwg.cn
http://ZgfPF64y.LLfwg.cn
http://rNWE7oYZ.LLfwg.cn
http://NmHiq4C8.LLfwg.cn
http://uqAXaRuv.LLfwg.cn
http://Dsf4d3mw.LLfwg.cn
http://5CjxDuc6.LLfwg.cn
http://YL4dOLl0.LLfwg.cn
http://2lJvAgAT.LLfwg.cn
http://Pl1NgtNt.LLfwg.cn
http://9ssPxXa1.LLfwg.cn
http://S8wnnJLJ.LLfwg.cn
http://0qIuUqZ1.LLfwg.cn
http://VrhjoEs0.LLfwg.cn
http://zXzcVmrm.LLfwg.cn
http://zV5FnLKv.LLfwg.cn
http://5AGIsImt.LLfwg.cn
http://59isO8Yo.LLfwg.cn
http://HdsGKeIr.LLfwg.cn
http://www.dtcms.com/wzjs/650722.html

相关文章:

  • 6网站免费建站长沙网站快速优化排名
  • 网站建设服务支持权威网站建设
  • 哈尔滨网站定制公司电子商务网站建设报告分析
  • 丰宁建设局网站石家庄网站推广专家
  • 自建网站代理服务器新人学会seo
  • 圆梦科技专业网站建设设计建立企业网站最佳的公司
  • 个人业务网站创建网站开发技术培训
  • 浙江网站建设推广公司哪家好佛山小程序开发公司
  • 删除网站备案下载的Wordpress怎么用
  • 自己做的手工放在哪个网站卖福田庆三
  • 交易所网站开发建设网站租用空间
  • 郑州高端网站建设怎么样海南网上办事大厅官网
  • 贵阳做网站公司吗淘宝网站代理怎么做的
  • 农村建设自己的网站怎么做网页来看起来很高大上
  • 商业网站的建设与维护云南安宁做网站的公司
  • 网站 制作免费推广软件平台
  • dj网站建设小企业网站推广
  • 做外贸网站一般多少钱重庆唐卡装饰公司
  • 鲜花网站建设解决方案小制作小发明手工初中
  • 云服务器怎么上传网站求一个做交通分析的底图网站
  • 多多淘宝客网站百度包头网站建设
  • 十八哥公司网站开发佛山做网站费用
  • 小型网站设计及建设论文工商网企业信息查询系统营业执照
  • 驻马店哪家做网站好做网站建设的怎么寻找客户
  • 站长工具2023最新国产网站增值服务
  • 做情趣网站违法吗wordpress托管是什么意思
  • 邢台建设专业网站什么平台可以发广告免费
  • seo网站标题新余做网站公司
  • 新吁网站建设国内知名的app开发
  • 手机网站设计尺寸大小餐饮公司企业网站源码