442 Часть III. Современное программирование на C++
указателей STUDENT с возможностью добавления кратного 5 числа элементов выглядит следующим образом:
STUDENT_POINTER_ARRAY studentArray3(99, 0, 5);
Для добавления элементов в массив существуют две функции. Функция Add вставляет элемент на первую доступную позицию:
studentArray3.Add(new STUDENT ("JohnNewton", 3.5));
Для добавления элемента в определенное место в массиве служит функция AddAt. Для добавления элемента на 9 место необходимо написать:
studentArray3.AddAtfnew STUDENT ("DeanBrown", 2.3), 10);
Функция AddAt недоступна для сортируемых контейнеров. Порядок элементов в них определяется путем сравнения.
Удаление объектов из массива выполняется с помощью функций-членов Destroy и Detach. Когда элемент удаляется из массива, все элементы с большими индексами сдвигаются. Для удаления и уничтожения элемента, связанного со студентом с индексом 10, используем функцию Destroy следующим образом:
studentArray3.Destroy(10);
При этом 11 элемент сдвинулся на 10 место, 12 — на 11 и т. д. Удалить и уничтожить элемент, связанный со студентом по имени DeanBrown, можно следующим образом:
STUDENT s("DeanBrown") ;
studentArray3.Destroy(&s) ;
Напомним, что операция эквивалентности == для класса STUDENT определена через равенство значений идентификаторов (ID).
Замечание
Функции-члены прямых контейнеров требуют передачи элементов по ссылке, а в случае косвенных контейнеров передаются указатели на элемент. Поскольку studentArray3 — косвенный контейнер, функции Destroy передается адрес объекта STUDENT (&s). Для конструктора studentArrayl должна использоваться передача по ссылке:
studentArray.Destroy(s);
Эта разница в передаче параметров в функции-члены действительна не только для массивов, но и для других контейнеров.
Функция Detach удаляет элемент, не уничтожая его:
studentArraуЗ.Detach(10); // удаляет 10-й элемент, не уничтожая его STUDENT s("DeanBrown");