首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么std::string没有emplace或emplace_back?

为什么std::string没有emplace或emplace_back?
EN

Stack Overflow用户
提问于 2020-03-04 18:53:26
回答 2查看 2.4K关注 0票数 4

我很肯定我以前在这里看到过这个问题,但我在搜索时似乎找不到这篇文章,我也想不起来答案了。

为什么没有emplaceemplace_backstd::string

我认为这与char的使用无关,因为您可以有一个字符向量,并且在向量中使用一个字符没有问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-04 19:00:46

push_back是不会有任何收益的

emplace_back的强大之处在于它构造了一个对象就地,在那里它被设计为驻留对象。不需要复制或移动。它还为创建对象提供了更简单的语法,但这只是一个小优势。

代码语言:javascript
复制
class Person
{
    std::string name;
    int age;
    double salary;
}

int main()
{
    std::vector<Person> people;
    people.push_back(Person{"Smith", 42, 10000.0}); //temporary object is needed, which is moved to storage
    people.emplace_back("Smith", 42, 10000.0); //no temporary object and concise syntax
}

对于std::string (或任何只能容纳原语类型的理论容器),增益是不存在的。无论您在适当的位置构造对象、移动对象或复制对象,都可以在程序集级别执行相同的操作--在给定内存中写入一些字节。

语法也不能变得比它更简洁--没有需要调用的构造函数。您可以使用文字变量或其他变量,但是您必须在push_backemplace_back中做完全相同的事情。

代码语言:javascript
复制
int main()
{
    std::vector<char> letters;
    letters.push_back('a');
    letters.emplace_back('a'); //no difference
}
票数 8
EN

Stack Overflow用户

发布于 2020-03-04 19:03:16

(例如) std::vector‹T>::emplace_back的优点是它直接在向量中构造一个T类型的对象,而不是构造一个临时的对象,然后将它复制进去。

由于char是一种基本类型,所以一种方法与另一种方法相比没有优势,因此std::string::emplace_back没有存在的理由。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60532890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档