@oftywave

Vector — объявление элементов, в чем разница между двумя способами?

в чем разница между
std::vector<std::string> vec_m = { "vec1", "vec2", "vec3" };


std::vector<std::string> vec_m;
vec_m.push_back("vec1");
vec_m.push_back("vec2");
vec_m.push_back("vec3");


std::vector<std::string> vec_m;
vec_m.emplace_back("vec1");
vec_m.emplace_back("vec2");
vec_m.emplace_back("vec3");


результат один и тот же, интересно узнать в чем же разница
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Первый способ: создаётся initializer_list, вызывается конструктор. Наиболее эффективен для простых тупых объектов.

Второй способ эквивалентен push_back(string("vec1")) и сильно полагается на оптимизацию передаваемых параметров. Наименее эффективен.

Третий способ гарантированно не создаёт промежуточные объекты (вызывает конструктор string(const char*) уже на месте). Вместе с reserve(3) наиболее эффективен для управляемых объектов.

UPD. 2 и 3 для string() не очень сильно различаются из-за эффективного переноса. А вот для более крупных объектов 3 лучше.

UPD2. Начиная с Си++20, 1 лучше, но только из-за того, что Си++ научился делать полноценные string’и при компиляции — то есть управляемый объект string обзавёлся некоторыми чертами тупого.

UPD3. Ни один компилятор пока constexpr string пока не поддерживает. Но ведь ни у кого стабильного 20 пока нет, правильно?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы