Программирование >>  Операторы преобразования типа 

1 ... 229 230 231 [ 232 ] 233 234 235 ... 239


Операции с неинициализированной памятью 713

О Просто вызывает деструктор объекта. О Эквивалент:

((Т*)р)->-Т()

bool operator== {const распределитель al. const распределитель a2)

О Возвращает true, если распределители a1 и а2 взаимозаменяемы.

О Два объекта распределителя считаются взаимозаменяемыми, если память, выделенная одним из них, может быть освобождена другим.

О Чтобы распределитель мог использоваться со стандартными контейнерами, распределители одного типа обязаны быть взаимозаменяемыми, поэтому функция должна всегда возвращать true.

bool operator!= (const распределитель al. const распределитель a2)

О Возвращает true, если распределители a1 и а2 взаимозаменяемы. О Эквивалент:

\{al==a2)

О Чтобы распределитель мог использоваться со стандартными контейнерами, распределители одного типа обязаны быть взаимозаменяемыми, поэтому функция должна всегда возвранщть false.

Операции с неинициализированной памятью

В этом разделе подробно описаны вспомогательные функции для работы с неинициализированной памятью. Примеры реализаций, безопасных с точки зрения исключений, основаны (с разрешения автора) на коде Грега Колвина (Greg Colvin).

void unin1tialized fill (Forwardlterator beg. Forwardlterator end.

const T& value)

О Инициализирует элементы интервала [beg,end) значением value. О Функция либо выполняется успешно, либо не вносит изменений. О Типичная реализация uninitialized fill():

namespace std {

template <class Forwlter. class T>

void un1n1t1alized f1ll(ForwIter beg, Forwlter end.

const T& value)

typedef typename iterator traits<ForwIter>::value type VT: Forwlter save(beg): try {

for (; beg!=end: ++beg) {



new {statlc cast<vo1d*>{&*beg))\/T(value);

eaten (...) [

for (; save!=beg; ++save) { save->~VT():

throw;

void uninitialized fill n (Forwardlterator beg. Size пит,

const T& value)

О Инициализирует пит элементов, начиная с beg, значением value. О Функция либо выполняется успешно, либо не вносит изменений. О Типичная реализация uninitialized fill n().

namespace std (

template <class ForwIter, class Size, class T> void unlnit1al1zed f111 n (ForwIter beg, Size num.

const T& value)

typedef typename 1terator tra1ts<Forwlter>::value type VT; ForwIter save(beg); try {

for с; num--; ++beg) (

new (stat1c cast<vo1d*>(S*beg))\/T(value):

catch (...) {

for (: save!=beg: ++save) { save->-VT();

throw;

О Пример использования функции uninitialized fill n() приведен на с. 703.

void un1nltial1zed copy (Inputlterator sourceBeg.

Inputlterator sourceEnd. Forwardlterator destBeg)

О Элементами из интервала [sourceBeg,sourceEnd) инициализирует память, начиная с destBeg.

О Функция ;гибо выполняется успешно, либо не вносит из.менений.



Операции с неинициализированной памятью 715

О Типичная реализация uninitialized copy():

nafTiespace std {

template <class Inputlter, class FQrwIter>

Forwlter un1nitial1zed fill n (Inputlter beg. Inputlter end.

Forwlter dest)

typedef typename iterator traits<ForwIter>::value type VT: Forwlter save(dest): try (

for (: beg!=end: ++beg.++dest) {

new {stat1c cast<vold*>C&*dest))\/T(value):

return dest:

catch (...) (

for (; save!=dest: ++save) { save->~VT():

throw:

Пример использования функции uninitialized copy() приведен на с. 704



1 ... 229 230 231 [ 232 ] 233 234 235 ... 239

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика