为什么 std::string 没有位置或 emplace_back?
Why is there no emplace or emplace_back for std::string?
我很确定我以前在这里看到过这个问题,但我尝试搜索时似乎找不到 post,而且我不记得答案了。
为什么 std::string
没有 emplace
或 emplace_back
?
我认为这与 char
的使用无关,因为您可以有一个字符向量,并且 emplace_back
在向量中输入一个字符没有问题。
push_back
不会有任何收获
emplace_back
的强大之处在于它 就地构造一个对象 ,它被设计为停留在原地。不需要复制或移动。它还为创建对象提供了更简单的语法,但这只是一个小优势。
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_back
和 emplace_back
中做完全相同的事情
int main()
{
std::vector<char> letters;
letters.push_back('a');
letters.emplace_back('a'); //no difference
}
(例)std::vector‹T>::emplace_back
的优点是直接在vector中构造一个T类型的对象,而不是构造一个临时的然后copy进去。
由于 char
是原始类型,因此一种方法与另一种方法相比没有优势,因此 std::string::emplace_back
没有理由存在。
我很确定我以前在这里看到过这个问题,但我尝试搜索时似乎找不到 post,而且我不记得答案了。
为什么 std::string
没有 emplace
或 emplace_back
?
我认为这与 char
的使用无关,因为您可以有一个字符向量,并且 emplace_back
在向量中输入一个字符没有问题。
push_back
emplace_back
的强大之处在于它 就地构造一个对象 ,它被设计为停留在原地。不需要复制或移动。它还为创建对象提供了更简单的语法,但这只是一个小优势。
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_back
和 emplace_back
int main()
{
std::vector<char> letters;
letters.push_back('a');
letters.emplace_back('a'); //no difference
}
(例)std::vector‹T>::emplace_back
的优点是直接在vector中构造一个T类型的对象,而不是构造一个临时的然后copy进去。
由于 char
是原始类型,因此一种方法与另一种方法相比没有优势,因此 std::string::emplace_back
没有理由存在。