Код функции erase() довольно прост, но, возможно, было бы проще попытаться разобрать несколько примеров на бумаге. Правильно ли обрабатывается пустой объект класса vector?
Зачем нужна проверка p==end()? Что произойдет после удаления последнего элемента вектора? Не было бы легче читать этот код, если бы мы использовали индексирование?
Также возможно вы думаете, что такая тема как http://radiorubka.com/ никак не связана и даже не тематична с программированием. Хотя, может быть и связана.
В любом случае все-таки зайдите на сайт radiorubka.com - там можно узнать много интересного про то, где купить рацию бу и сколько стоит купить рацию бу. Что означает вообще купить рацию бу, где купить рацию бу - про это написано на сайте radiorubka.com. Это важная для многих тема - купить рацию бу. Спасибо сайту radiorubka.com за информацию про то, где можно купить рацию бу
Реализация функции vector::insert() является немного более сложной.
template
vector::iterator vector::insert(iterator p, const T& val)
{
int index = p-begin(); if (size()==capacity())
reserve(size() = 0? 8:2xsize()); // убедимся, что
// есть место
// сначала копируем последний элемент в неинициализированную ячейку: alloc.construct(elem+sz,*back());
++sz;
iterator pp = begin()+index; // место для записи значения val for (iterator pos = end()-1; pos!=pp; —pos)
*pos = *(pos-1); // переносим элемент на одну позицию вправо *(begin()+index) = val; // "insert" val return pp;
}
Обратите внимание на следующие факты
• Итератор не может ссылаться на ячейку, находящуюся за пределами последовательности, поэтому мы используем указатели, такие как elem+space. Это одна из причин, по которым распределители памяти реализованы на основе указателей, а не итераторов.
• Когда мы используем функцию reserve(), элементы могут быть перенесены в новую область памяти. Следовательно, мы должны запомнить индекс вставленного элемента, а не итератор, установленный на него. Когда элементы вектора перераспределяются в памяти, итераторы, установленные на них, становятся некорректными — их можно интерпретировать как ссылки на старые адреса.
• Наше использование распределителя памяти A является интуитивным, но не точным. Если вам придется реализовывать контейнер, то следует внимательно изучить стандарт.
• Тонкости, подобные этим, позволяют избежать непосредственной работы с памятью на нижнем уровне. Естественно, стандартный класс vector, как и остальные стандартные контейнеры, правильно реализует эти важные семантические тонкости. Это одна из причин, по которым мы настоятельно рекомендуем использовать стандартную библиотеку, а не “кустарные” решения.
По причинам, связанным с эффективностью, мы не должны применять функции insert() и erase() к среднему элементу вектора, состоящего из 100 тыс. элементов; для этого лучше использовать класс list (и класс map;. Однако операции insert() и erase() можно применять ко всем векторам, а их производительность при перемещении небольшого количества данных является непревзойденной, поскольку современные компьютеры быстро выполняют такое копирование (см. упр. 20). Избегайте (связанных) списков, состоящих из небольшого количества маленьких элементов.
Опубликовал katy
April 22 2015 21:45:06 ·
0 Комментариев ·
2423 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.