Почему нет emplace или emplace_back для std :: string? - PullRequest
4 голосов
/ 04 марта 2020

Я почти уверен, что видел этот вопрос здесь раньше, но я не могу найти сообщение, когда пытался искать, и я не помню ответ.

Почему нет emplace или emplace_back для std::string?

Я не думаю, что это связано с использованием char, так как вы можете иметь вектор символов, и нет проблем с emplace_back введением символа в векторе.

Ответы [ 2 ]

5 голосов
/ 04 марта 2020

Не было бы никакого усиления по сравнению с 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
}
0 голосов
/ 04 марта 2020

Преимущество (например) std::vector‹T>::emplace_back состоит в том, что он создает объект типа T непосредственно в векторе, а не создает временное и затем копирует его.

Поскольку char является примитивом тип, нет никакого преимущества в одном методе перед другим, поэтому нет никаких оснований для существования std::string::emplace_back.

...