«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как эффективно дублировать вектор в C++ без циклов?

Как эффективно дублировать вектор в C++ без циклов?

Опубликовано 22 декабря 2024 г.
Просматривать:863

How to Efficiently Duplicate a Vector in C   Without Loops?

Создание дубликата вектора

При добавлении вектора к самому себе желательно избегать использования циклов из соображений производительности. Функция std::vector::insert, хотя и является опцией, не позволяет использовать итератор для *this.

Подход к проблеме с помощью std::copy

Использование std::copy для решения этой проблемы может показаться решением, но такой подход может привести к ошибкам сегментации.

Оптимальное решение

Оптимальное решение предполагает использование как resize (или резервирования), так и copy_n. Вот как это работает:

auto old_count = xx.size();
xx.resize(2 * old_count);
std::copy_n(xx.begin(), old_count, xx.begin()   old_count);

Этот код сначала сохраняет исходный размер вектора в old_count. Затем он изменяет размер xx, чтобы удвоить свою емкость. Наконец, std::copy_n копирует элементы с начала xx до конца xx, эффективно дублируя вектор.

В качестве альтернативы вы можете использовать резерв вместо изменения размера:

auto old_count = xx.size();
xx.reserve(2 * old_count);
std::copy_n(xx.begin(), old_count, std::back_inserter(xx));

При использовании резерва copy_n необходим, поскольку итератор end() указывает за конец, что делает его недействительным для вставки.

Этот подход удовлетворяет условиям, изложенным в 23.3.6.5 [vector.modifiers], гарантируя, что итераторы и ссылки до того, как точка вставки останется действительной, и, если это возможно, перераспределение не произойдет.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3