В C++ есть несколько операций над
std::vector, которые могут привести к множественному копированию элементов. Рассмотрим основные из них. 🟠Изменение размера (`resize`)
Метод
resize() может вызвать множественное копирование, если новый размер вектора превышает его текущую вместимость (capacity). #include <iostream>
#include <vector>
struct Data {
int value;
Data(int v) : value(v) {}
Data(const Data& other) { // Конструктор копирования
value = other.value;
std::cout << "Copying Data: " << value << std::endl;
}
};
int main() {
std::vector<Data> vec(3, Data(10)); // Заполняем 3 элементами
std::cout << "Resizing..." << std::endl;
vec.resize(10, Data(20)); // Вектор расширяется, возможны копирования
}
🟠Вставка элемента (`insert` и `emplace`)
Если
std::vector не имеет достаточного запаса (capacity), вставка нового элемента может привести к реаллокации и копированию всех элементов. std::vector<int> vec = {1, 2, 3};
vec.insert(vec.begin(), 0); // Вставка в начало → все элементы сдвигаются🟠Присваивание (`operator=`)
Если один
std::vector присваивается другому, все элементы копируются.std::vector<int> vec1 = {1, 2, 3, 4, 5};
std::vector<int> vec2;
vec2 = vec1; // Копирование всех элементов🟠Возвращение `std::vector` из функции
Если возвращаем
std::vector по значению, может произойти копирование (если не работает оптимизация RVO/NRVO или перемещение).std::vector<int> createVector() {
std::vector<int> vec(100, 42);
return vec; // Может скопироваться, если нет RVO
}Ставь 👍 и забирай 📚 Базу знаний