vector_of views - это последовательности свободного порядка с постоянным временным позиционным доступом и итераторами случайного доступа. Элементы в векторе_вида по умолчанию отсортированы в соответствии с их порядком вставки: это означает, что новые элементы, вставленные через другой вид<bimap>, прилагаются к концу вектора_вида; кроме того, предусмотрены средства для дальнейшей перестановки элементов. Публичный интерфейс vector_of view включает в себя интерфейс list_of views с различиями в сложности операций, а также дополнительные операции для позиционного доступа (<operator[]>и<at()>) и для обработки емкости. Действительность итераторов и ссылки на элементы сохраняются во всех операциях, независимо от состояния мощности.
Как и в случае с list_of views, вектор_of views имеет следующие ограничения в отношении контейнеров последовательностей STL:
Vector_of Views не являетсяПрименимо(как и любая другая точка зрения).
Вставка в вектор_взгляда может потерпеть неудачу из-за столкновений с другими взглядами. Это изменяет семантику операций, предоставляемых относительно их аналогов в контейнерах последовательностей STL.
Элементы в векторном представлении не являются изменчивыми и могут быть изменены только путем замены и изменения функций-членов.
Учитывая эти ограничения, вектором просмотров являются моделиКонтейнера случайного доступаиПоследовательности обратной вставки. Хотя эти представления не моделируютFront Insertion Sequence, поскольку вставка и удаление передней части занимают линейное время, операции фронта, тем не менее, предоставляются для соответствия интерфейсу list_of views. Мы описываем только те виды и операции, которые либо не присутствуют в моделируемых концепциях, либо не соответствуют требованиям к этим типам контейнеров.
namespaceboost{namespacebimaps{namespaceviews{template<-implementation defined parameter list->class-implementation defined view name-{public:// typestypedef-unspecified-value_type;typedef-unspecified-allocator_type;typedef-unspecified-reference;typedef-unspecified-const_reference;typedef-unspecified-iterator;typedef-unspecified-const_iterator;typedef-unspecified-size_type;typedef-unspecified-difference_type;typedef-unspecified-pointer;typedef-unspecified-const_pointer;typedef-unspecified-reverse_iterator;typedef-unspecified-const_reverse_iterator;typedef-unspecified-info_type;// construct / copy / destroythis_type&operator=(this_type&x);template<classInputIterator>voidassign(InputIteratorfirst,InputIteratorlast);voidassign(size_typen,constvalue_type&value);allocator_typeget_allocator()const;// iteratorsiteratorbegin();const_iteratorbegin()const;iteratorend();const_iteratorend()const;reverse_iteratorrbegin();const_reverse_iteratorrbegin()const;reverse_iteratorrend();const_reverse_iteratorrend()const;// capacityboolempty()const;size_typesize()const;size_typemax_size()const;size_typecapacity()const;voidreserve(size_typem);voidresize(size_typen,constvalue_type&x=value_type());// accessconst_referenceoperator[](size_typen)const;const_referenceat(size_typen)const;const_referencefront()const;const_referenceback()const;// modifiersstd::pair<iterator,bool>push_front(constvalue_type&x);voidpop_front();std::pair<iterator,bool>push_back(constvalue_type&x);voidpop_back();std::pair<iterator,bool>insert(iteratorposition,constvalue_type&x);voidinsert(iteratorposition,size_typem,constvalue_type&x);template<classInputIterator>voidinsert(iteratorposition,InputIteratorfirst,InputIteratorlast);iteratorerase(iteratorposition);iteratorerase(iteratorfirst,iteratorlast);boolreplace(iteratorposition,constvalue_type&x);// Only in map views// {typedef-unspecified-key_type;typedef-unspecified-mapped_type;typedef-unspecified-data_type;// Equal to mapped_typetemplate<classCompatibleKey>boolreplace_key(iteratorposition,constCompatibleKey&x);template<classCompatibleData>boolreplace_data(iteratorposition,constCompatibleData&x);template<classKeyModifier>boolmodify_key(iteratorposition,KeyModifiermod);template<classDataModifier>boolmodify_data(iteratorposition,DataModifiermod);// }voidclear();// list operationsvoidsplice(iteratorposition,this_type&x);voidsplice(iteratorposition,this_type&x,iteratori);voidsplice(iteratorposition,this_type&x,iteratorfirst,iteratorlast);voidremove(constvalue_type&value);template<classPredicate>voidremove_if(Predicatepred);voidunique();template<classBinaryPredicate>voidunique(BinaryPredicatebinary_pred);voidmerge(this_type&x);template<typenameCompare>voidmerge(this_type&x,Comparecomp);voidsort();template<typenameCompare>voidsort(Comparecomp);voidreverse();// rearrange operationsvoidrelocate(iteratorposition,iteratori);voidrelocate(iteratorposition,iteratorfirst,iteratorlast);};// view comparisonbooloperator==(constthis_type&v1,constthis_type&v2);booloperator<(constthis_type&v1,constthis_type&v2);booloperator!=(constthis_type&v1,constthis_type&v2);booloperator>(constthis_type&v1,constthis_type&v2);booloperator>=(constthis_type&v1,constthis_type&v2);booloperator<=(constthis_type&v1,constthis_type&v2);}// namespace views}// namespace bimap}// namespace boost
Требуется:<InputIterator>является модельюИтератора вводанад элементами типа<value_type>или типа, конвертируемого в<value_type>.<first>и<last>не являются итераторами в любом виде<bimap>, к которому принадлежит этот вид.<last>достижимо от<first>.
Возвращение:Общее число элементов<c>таково, что, когда<size()<c>, обратные вставки происходят в постоянное время (общий случай, описанный i(n), являетсяамортизированнымпостоянным временем).
Примечание:Действительность итераторов и ссылки на элементы сохраняются во всех вставках независимо от состояния емкости.
voidreserve(size_typem);
Эффекты:Если предыдущее значение<capacity()>больше или равно<m>, то ничего не делается; в противном случае внутренняя емкость изменяется так, что<capacity()>=m>.
Сложность:Если емкость не изменяется, постоянная; в противном случае O(n).
Безопасность исключения:Если емкость не изменяется, не хроу; в противном случае — сильная.
Эффекты:Вставляет х в начале последовательности, если никакое другое представление<bimap>не запрещает вставку.
Возвращение:Возвратное значение — пара<p>.<p.second>—<true>, если и только если вставка имела место. При успешной вставке<p.first>указывает на вставленный элемент; в противном случае<p.first>указывает на элемент, который вызвал запрещение вставки. Обратите внимание, что более одного элемента может привести к тому, что вставка не допускается.
Эффекты:Вставляет<x>в конце последовательности, если никакое другое представление<bimap>не запрещает вставку.
Возвращение:Возвратное значение — пара<p>.<p.second>—<true>, если и только если вставка имела место. При успешной вставке<p.first>указывает на вставленный элемент; в противном случае<p.first>указывает на элемент, который вызвал запрещение вставки. Обратите внимание, что более одного элемента может привести к тому, что вставка не допускается.
Эффекты:Вставляется<x>перед положением, если вставка допускается всеми другими видами<bimap>.
Возвращение:Возвратное значение — пара<p>.<p.second>—<true>, если и только если вставка имела место. При успешной вставке<p.first>указывает на вставленный элемент; в противном случае<p.first>указывает на элемент, который вызвал запрещение вставки. Обратите внимание, что более одного элемента может привести к тому, что вставка не допускается.
Требуется:<position>является действительным итератором вида.<InputIterator>является модельюИтератора вводанад элементами типа<value_type>или типа, конвертируемого в<value_type>.<first>и<last>не являются итераторами в любой вид<bimap>, к которому принадлежит этот вид.<last>достижимо от<first>.
Эффекты:Присваивает значение x элементу, указанному положением в<bimap>, к которому относится вид, если замена допускается всеми другими видами<bimap>.
Условия:Действительность положения сохраняется во всех случаях.
Возврат:<true>если замена имела место,<false>в противном случае.
Безопасность исключения:Сильная. Если какое-либо исключение было сделано в результате какой-либо операции, предоставленной пользователем, то<bimap>, к которой принадлежит вид, остается в первоначальном состоянии.
Требуется:<position>является действительным сносным итератором заданного вида.<CompatibleKey>может быть назначен<key_type>.
Эффекты:Назначает значение<x>на<e.first>, где<e>является элементом, указанным<position>в<bimap>, которому принадлежит заданный вид, если замена допускается всеми другими видами<bimap>.
Условия:Действительность положения сохраняется во всех случаях.
Возврат:<true>если замена имела место,<false>в противном случае.
Безопасность исключения:Сильная. Если какое-либо пользовательское действие приводит к исключению, то<bimap>, к которому относится заданный вид, остается в исходном состоянии.
Требуется:<position>является действительным сносным итератором заданного вида.<CompatibleKey>может быть присвоено<mapped_type>.
Эффекты:Назначает значение<x>на<e.second>, где<e>является элементом, на который указывает<position>в<bimap>, которому принадлежит заданный вид, если замена допускается всеми другими видами<bimap>.
Условия:Действительность положения сохраняется во всех случаях.
Возврат:<true>если замена имела место,<false>в противном случае.
Безопасность исключения:Сильная. Если какое-либо пользовательское действие приводит к исключению, то<bimap>, к которому относится заданный вид, остается в исходном состоянии.
Эффекты:Звонки<mod(e.first)>, где e является элементом, указанным положением, и перестраивает<*position>во все представления<bimap>. Если перегруппировка не удается, элемент стирается. Успешно, если перегруппировка разрешена всеми другими взглядами<bimap>.
Последующие условия:Срок действия<position>сохраняется, если операция увенчается успехом.
Возврат:<true>, если операция удалась,<false>в противном случае.
Безопасность исключения:Базовая. Если исключение выбрасывается какой-либо пользовательской операцией (за исключением, возможно, мода), то элемент, указанный позицией, стирается.
Примечание:Предоставляется только для просмотра карт.
Эффекты:Звонки<mod(e.second)>, где e — элемент, на который указывает положение, и перегруппировка<*position>во все виды<bimap>. Если перегруппировка не удается, элемент стирается. Успешно, если перегруппировка разрешена всеми другими взглядами<bimap>.
Последующие условия:Срок действия<position>сохраняется, если операция увенчается успехом.
Возврат:<true>, если операция удалась,<false>в противном случае.
Безопасность исключения:Базовая. Если исключение выбрасывается какой-либо пользовательской операцией (за исключением, возможно, мода), то элемент, указанный позицией, стирается.
Примечание:Предоставляется только для просмотра карт.
<vector_of>просмотры повторяют интерфейс<list_of>просмотров, который, в свою очередь, включает в себя операции списка, предусмотренные<std::list>. Синтаксис и поведение этих операций точно соответствуют представлениям<list_of>, но связанные с ними границы сложности в целом различаются.
Эффекты:Включить элемент, указанный<i>перед<position>: Если вставка удалась, элемент стирается из<x>. В особом случае<&x==this>копия или удаление не выполняется, и операция всегда успешна. Если<position==i>не выполняется операция.
Пост-условия:Если<&x==this>, ни итератор, ни ссылка не являются недействительными.
Сложность:Если<&x==this>, O(rel(позиция,i,i+1)); в противном случае O(shl(end()-позиция,1) + I(n) + D(n)).
Безопасность:Если<&x==this>, то не хроу; в противном случае сильный.
Требуется:<position>является действительным итератором представления.<first>и<last>являются действительными итераторами<x>.<last>достижимо от<first>.<position>не находится в пределах<[first,last)>.
Эффекты:Для каждого элемента в диапазоне<[first,last)>вставку пробуют раньше<position>; при успешной операции элемент стирают из<x>. В особом случае<&x==this>копия или удаление не выполняется, и вставки всегда успешны.
Пост-условия:Если<&x==this>, ни итератор, ни ссылка не являются недействительными.
Сложность:Если<&x==this>, O(rel(position, first,last)); в противном случае O(shl(end()-position,m) + m*I(n+m) + m*D(x.size())), где m - число элементов в<[first,last)>.
Безопасность в отношении исключений:Если<&x==this>, не хроу; в противном случае, базовая.
voidremove(constvalue_type&value);
Эффекты:Стирает все элементы представления, которые сравниваются равными<value>.
Сложность:O(n + m*D(n)), где m — число стертых элементов.
Эффекты:Стирает все элементы<x>вида, для которого<pred(x)>удерживает.
Сложность:O(n + m*D(n)), где m — число стертых элементов.
Безопасность исключения:Базовая.
voidunique();
Эффекты:Устраняет все, кроме первого элемента, из каждой последовательной группы равных элементов, указанных итератором<i>в диапазоне<[first+1,last)>, для которого<*i==*(i-1)>.
Сложность:O(n + m*D(n)), где m — число стертых элементов.
Эффекты:Устраняет все, кроме первого элемента, из каждой последовательной группы элементов, указанных итератором i в диапазоне<[first+1,last)>, для которого<binary_pred(*i,*(i-1))>удерживает.
Сложность:O(n + m*D(n)), где m — число стертых элементов.
Безопасность исключения:Базовая.
voidmerge(this_type&x);
Требуется:<std::less<value_type>>— этострогий слабый порядокнад<value_type>. И вид, и<x>сортируются по<std::less<value_type>>.
Эффекты:Попытки вставить каждый элемент x в соответствующее положение вида (согласно порядку). Удачно вставленные элементы стираются из<x>. Полученная последовательность является стабильной, то есть эквивалентные элементы любого контейнера сохраняют свое относительное положение. В особом случае<&x==this>операция не проводится.
Постусловия:Элементы в представлении и оставшиеся элементы в<x>сортируются. Сохраняется достоверность итераторов к виду и нестираемых элементов<x>ссылок.
Сложность:Если<&x==this>, константа; в противном случае O(n + x.size()*I(n+x.size()) + x.size()*D(x.size())).
Безопасность в отношении исключений:Если<&x==this>, не хроу; в противном случае, базовая.
Эффекты:Попытки вставить каждый элемент<x>в соответствующее положение вида (согласно<comp>). Удачно вставленные элементы стираются из<x>. Полученная последовательность является стабильной, то есть эквивалентные элементы любого контейнера сохраняют свое относительное положение. В особом случае<&x==this>операция не проводится.
Пост-условия:Элементы в представлении и оставшиеся элементы в<x>отсортированы согласно<comp>. Сохраняется достоверность итераторов к виду и нестираемых элементов<x>ссылок.
Сложность:Если<&x==this>, константа; в противном случае O(n + x.size()*I(n+x.size()) + x.size()*D(x.size())).
Безопасность в отношении исключений:Если<&x==this>, не хроу; в противном случае, базовая.
Эти операции без аналога в<std::list>(хотя сплайс обеспечивает частично перекрывающуюся функциональность), выполняют индивидуальное и глобальное перепозиционирование элементов внутри индекса.
Виды не могут быть сериализованы сами по себе, но только как часть<bimap>, в которую они встроены. При описании дополнительных предварительных условий и гарантий, связанных с<vector_of>представлениями в отношении сериализации их встраиваемых контейнеров, мы используем понятия, определенные в разделе сериализации<bimap>.
Операция:сохранение a<bimap>b в выходной архив (архив XML) ar.
Требуется:Никаких дополнительных требований к контейнерам.
Операция:загрузка a<bimap>b' из входного архива (архив XML) ar.
Требуется:Никаких дополнительных требований к контейнерам.
Пост-условия:При успешной погрузке каждый из элементов<[begin(),end())>представляет собой восстановленную копию соответствующего элемента в<[m.get<i>().begin(),m.get<i>().end())>, где<i>- положение<vector_of>вида в контейнере.
Постусловия:При удачной погрузке, если она была сносной, то<*it>' является восстановленной копией<*it>, в противном случае<it><==end()>.
Примечание:Допускается, что это<const_iterator>и восстановленный<it><iterator>, или наоборот.
Статья vector_of Reference раздела Chapter 1. Boost.Bimap Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.