Функция uninitialized_copy
Функция uninitialized_copy копирует элементы
из исходного диапазона в область неинициализированной
памяти. В первом параметре мы передаем итератор на
начало исходного диапазона, во втором - итератор на
конец исходного диапазона, а в третий - итератор на
начало области неинициализированной памяти, куда
следует скопировать элементы. В отличие от
std::copy, эта функция не присваивает значения
существующим объектам, а создает новые объекты
с помощью конструктора копирования.
Синтаксис
uninitialized_copy(first, last, d_first)
Пример
Давайте скопируем элементы вектора в
неинициализированную память, выделенную
через operator new:
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
int main()
{
vector<int> src = {1, 2, 3, 4, 5};
int* buf = static_cast<int*>(
operator new(sizeof(int) * src.size())
);
uninitialized_copy(src.begin(), src.end(), buf);
for (size_t i = 0; i < src.size(); i++) {
cout << buf[i] << " ";
}
cout << endl;
destroy_at(buf);
operator delete(buf);
return 0;
}
Результат выполнения кода:
1 2 3 4 5
Пример
Давайте скопируем строки из одного вектора в неинициализированную память:
#include <iostream>
#include <memory>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> src = {"a", "b", "c", "d", "e"};
string* buf = static_cast<string*>(
operator new(sizeof(string) * src.size())
);
uninitialized_copy(src.begin(), src.end(), buf);
for (size_t i = 0; i < src.size(); i++) {
cout << buf[i] << " ";
}
cout << endl;
for (size_t i = 0; i < src.size(); i++) {
destroy_at(buf + i);
}
operator delete(buf);
return 0;
}
Результат выполнения кода:
"a b c d e"
Смотрите также
-
функция
uninitialized_fill,
которая заполняет неинициализированную память -
функция
construct_at,
которая создает объект в заданной памяти -
функция
destroy_at,
которая уничтожает объект по указателю -
функция
allocator,
который управляет выделением памяти