Создание дубликата вектора
При добавлении вектора к самому себе желательно избегать использования циклов из соображений производительности. Функция 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