簡體   English   中英

為什么 std::string 沒有 emplace 或 emplace_back?

[英]Why is there no emplace or emplace_back for std::string?

我很確定我以前在這里看到過這個問題,但是當我嘗試搜索時似乎找不到該帖子,而且我不記得答案了。

為什么沒有emplaceemplace_backstd::string

我認為這與char的使用無關,因為您可以擁有一個字符向量,並且在向量中使用emplace_back一個字符沒有問題。

push_back不會有任何好處

emplace_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_backemplace_back做完全相同的事情

int main()
{
    std::vector<char> letters;
    letters.push_back('a');
    letters.emplace_back('a'); //no difference
}

(eg) std::vector‹T>::emplace_back是它直接在向量中構造了一個 T 類型的對象,而不是構造一個臨時對象然后再復制進去。

由於char是一種原始類型,因此一種方法與另一種方法相比沒有優勢,因此std::string::emplace_back沒有理由存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM