Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

vector_of Reference

Boost , Chapter 1. Boost.Bimap , Reference

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext
namespace boost {
namespace bimaps {
template< class KeyType >
struct vector_of;
struct vector_of_relation;
} // namespace bimap
} // namespace boost

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. Мы описываем только те виды и операции, которые либо не присутствуют в моделируемых концепциях, либо не соответствуют требованиям к этим типам контейнеров.

namespace boost {
namespace bimaps {
namespace views {
template< -implementation defined parameter list- >
class -implementation defined view name-
{
    public:
    // types
    typedef -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 / destroy
    this_type & operator=(this_type & x);
    template< class InputIterator >
    void assign(InputIterator first, InputIterator last);
    void assign(size_type n, const value_type & value);
    allocator_type get_allocator() const;
    // iterators
    iterator               begin();
    const_iterator         begin() const;
    iterator               end();
    const_iterator         end() const;
    reverse_iterator       rbegin();
    const_reverse_iterator rbegin() const;
    reverse_iterator       rend();
    const_reverse_iterator rend() const;
    // capacity
    bool      empty() const;
    size_type size() const;
    size_type max_size() const;
    size_type capacity() const;
    void reserve(size_type m);
    void resize(size_type n, const value_type & x = value_type());
    // access
    const_reference operator[](size_type n) const;
    const_reference at(size_type n) const;
    const_reference front() const;
    const_reference back() const;
    // modifiers
    std::pair<iterator,bool> push_front(const value_type & x);
    void                     pop_front();
    std::pair<iterator,bool> push_back(const value_type & x);
    void                     pop_back();
    std::pair<iterator,bool> insert(iterator position, const value_type & x);
    void insert(iterator position, size_type m, const value_type & x);
    template< class InputIterator>
    void insert(iterator position, InputIterator first, InputIterator last);
    iterator erase(iterator position);
    iterator erase(iterator first, iterator last);
    bool replace(iterator position, const value_type & x);
    // Only in map views
    // {
      typedef -unspecified- key_type;
      typedef -unspecified- mapped_type;
      typedef -unspecified- data_type; // Equal to mapped_type
      template< class CompatibleKey >
      bool replace_key(iterator position, const CompatibleKey & x);
      template< class CompatibleData >
      bool replace_data(iterator position, const CompatibleData & x);
      template< class KeyModifier >
      bool modify_key(iterator position, KeyModifier mod);
      template< class DataModifier >
      bool modify_data(iterator position, DataModifier mod);
    // }
    void clear();
    // list operations
    void splice(iterator position, this_type & x);
    void splice(iterator position, this_type & x, iterator i);
    void splice(
        iterator position, this_type & x, iterator first, iterator last);
    void remove(const value_type & value);
    template< class Predicate >
    void remove_if(Predicate pred);
    void unique();
    template< class BinaryPredicate >
    void unique(BinaryPredicate binary_pred);
    void merge(this_type & x);
    template< typename Compare >
    void merge(this_type & x, Compare comp);
    void sort();
    template< typename Compare >
    void sort(Compare comp);
    void reverse();
    // rearrange operations
    void relocate(iterator position, iterator i);
    void relocate(iterator position, iterator first, iterator last);
};
// view comparison
bool operator==(const this_type & v1, const this_type & v2 );
bool operator< (const this_type & v1, const this_type & v2 );
bool operator!=(const this_type & v1, const this_type & v2 );
bool operator> (const this_type & v1, const this_type & v2 );
bool operator>=(const this_type & v1, const this_type & v2 );
bool operator<=(const this_type & v1, const this_type & v2 );
} // namespace views
} // namespace bimap
} // namespace boost

В случае с<bimap<vector_of<Left>,...>>

В представленном виде:

typedef signature-compatible with relation< Left, ... > key_type;
typedef signature-compatible with relation< Left, ... > value_type;

На левой карте вид:

typedef  Left  key_type;
typedef  ...   mapped_type;
typedef signature-compatible with std::pair< Left, ... > value_type;

В правильном виде карты:

typedef  ...  key_type;
typedef  Left mapped_type;
typedef signature-compatible with std::pair< ... , Left > value_type;

Здесь и в описаниях операций<vector_of>взглядов мы принимаем схему, изложенную вразделе подписи сложности. Схема сложности<vector_of>вид:

  • Копирование:<c(n)=n*log(n)>,
  • <i(n)=1>(постоянная амортизация),
  • <h(n)=1>(постоянная амортизация),
  • удаление:<d(n)=m>, где m - расстояние от удаленного элемента до конца последовательности,
  • Замена:<r(n)=1>(постоянная),
  • Изменить<m(n)=1>(постоянно).

В качестве удобства для записи некоторых формул сложности также используются следующие выражения:

<shl>и<rel>обозначаютсдвигиперемещениесоответственно.

<vector_of>виды инстанцируются внутри<bimap>и определяются с помощью спецификаторов типа сбора и самой карты. Обоснования зависят от следующих видов:

  • <Value>из<vector_of>,
  • <Allocator>из<bimap>,

Как поясняется в разделе «Концепции взглядов», во взглядах нет публичных конструкторов или деструкторов. Присвоение, с другой стороны, предусмотрено.

this_type & operator=(const this_type & x);
  • Эффекты:<a=b;>, где a и b являются<bimap>объектами, к которым<*this>и<x>относятся соответственно.
  • Возвращение:<*this>.
template< class InputIterator >
void assign(InputIterator first, InputIterator last);
  • Требуется:<InputIterator>является модельюИтератора вводанад элементами типа<value_type>или типа, конвертируемого в<value_type>.<first>и<last>не являются итераторами в любом виде<bimap>, к которому принадлежит этот вид.<last>достижимо от<first>.
  • Эффекты:<clear();insert(end(),first,last);>
void assign(size_type n, const value_type & value);
  • Эффекты:<clear();for(size_type i= 0; i< n; ++n)push_back(v);>
size_type capacity() const;
  • Возвращение:Общее число элементов<c>таково, что, когда<size() <c>, обратные вставки происходят в постоянное время (общий случай, описанный i(n), являетсяамортизированнымпостоянным временем).
  • Примечание:Действительность итераторов и ссылки на элементы сохраняются во всех вставках независимо от состояния емкости.
void reserve(size_type m);
  • Эффекты:Если предыдущее значение<capacity()>больше или равно<m>, то ничего не делается; в противном случае внутренняя емкость изменяется так, что<capacity()>=m>.
  • Сложность:Если емкость не изменяется, постоянная; в противном случае O(n).
  • Безопасность исключения:Если емкость не изменяется, не хроу; в противном случае — сильная.
void resize(size_type n, const value_type & x = value_type());
  • Эффекты:<if(n>size())insert(end(), n-size(), x);><elseif(n<size())erase(begin()+n,end());>
  • Примечание:Если требуется расширение, то после этой операции размер точки зрения не гарантируется n (другие точки зрения могут запрещать вставки).
std::pair<iterator,bool> push_front(const value_type & x);
  • Эффекты:Вставляет х в начале последовательности, если никакое другое представление<bimap>не запрещает вставку.
  • Возвращение:Возвратное значение — пара<p>.<p.second>—<true>, если и только если вставка имела место. При успешной вставке<p.first>указывает на вставленный элемент; в противном случае<p.first>указывает на элемент, который вызвал запрещение вставки. Обратите внимание, что более одного элемента может привести к тому, что вставка не допускается.
  • Сложность:О(n+I(n)).
  • Безопасность:Сильный.
std::pair<iterator,bool> push_back(const value_type & x);
  • Эффекты:Вставляет<x>в конце последовательности, если никакое другое представление<bimap>не запрещает вставку.
  • Возвращение:Возвратное значение — пара<p>.<p.second>—<true>, если и только если вставка имела место. При успешной вставке<p.first>указывает на вставленный элемент; в противном случае<p.first>указывает на элемент, который вызвал запрещение вставки. Обратите внимание, что более одного элемента может привести к тому, что вставка не допускается.
  • Сложность:О(I(n)).
  • Безопасность:Сильный.
std::pair<iterator,bool> insert(iterator position, const value_type & x);
  • Требуется:<position>является действительным итератором представления.
  • Эффекты:Вставляется<x>перед положением, если вставка допускается всеми другими видами<bimap>.
  • Возвращение:Возвратное значение — пара<p>.<p.second>—<true>, если и только если вставка имела место. При успешной вставке<p.first>указывает на вставленный элемент; в противном случае<p.first>указывает на элемент, который вызвал запрещение вставки. Обратите внимание, что более одного элемента может привести к тому, что вставка не допускается.
  • Сложность:O(shl(end()-position,1) + I(n)).
  • Безопасность:Сильный.
void insert(iterator position, size_type m, const value_type & x);
  • Требуется:<position>является действительным итератором представления.
  • Эффекты:<for(size_type i= 0; i< m; ++i)insert(position,x);>
  • Сложность:O(shl(end()-position,m) + m*I(n+m)).
template< class InputIterator >
void insert(iterator position, InputIterator first, InputIterator last);
  • Требуется:<position>является действительным итератором вида.<InputIterator>является модельюИтератора вводанад элементами типа<value_type>или типа, конвертируемого в<value_type>.<first>и<last>не являются итераторами в любой вид<bimap>, к которому принадлежит этот вид.<last>достижимо от<first>.
  • Эффекты:<while(first!=last)insert(position,*first++);>
  • Сложность:O(shl(end()-position,m) + m*I(n+m)), где m — число элементов в<[first,last)>.
  • Безопасность исключения:Базовая.
iterator erase(iterator position);
  • Требуется:<position>является действительным достойным уважения итератором представления.
  • Эффекты:Удалить элемент, на который указывает<position>.
  • Возвращение:Итератор, указывающий на элемент сразу после того, который был удален, или<end()>, если такой элемент не существует.
  • Сложность:O(D(n)).
  • Безопасность исключения:нехроу.
iterator erase(iterator first, iterator last);
  • Требуется:<[first,last)>является допустимым диапазоном обзора.
  • Эффекты:Исключает элементы в<[first,last)>.
  • Возвращение:.
  • Сложность:O(m*D(n)), где m — число элементов в<[first,last)>.
  • Безопасность исключения:нехроу.
bool replace(iterator position, const value_type & x);
  • Требуется:<position>является действительным достойным уважения итератором представления.
  • Эффекты:Присваивает значение x элементу, указанному положением в<bimap>, к которому относится вид, если замена допускается всеми другими видами<bimap>.
  • Условия:Действительность положения сохраняется во всех случаях.
  • Возврат:<true>если замена имела место,<false>в противном случае.
  • Сложность:О(R(n)).
  • Безопасность исключения:Сильная. Если какое-либо исключение было сделано в результате какой-либо операции, предоставленной пользователем, то<bimap>, к которой принадлежит вид, остается в первоначальном состоянии.
template< class CompatibleKey >
bool replace_key(iterator position, const CompatibleKey & x);
  • Требуется:<position>является действительным сносным итератором заданного вида.<CompatibleKey>может быть назначен<key_type>.
  • Эффекты:Назначает значение<x>на<e.first>, где<e>является элементом, указанным<position>в<bimap>, которому принадлежит заданный вид, если замена допускается всеми другими видами<bimap>.
  • Условия:Действительность положения сохраняется во всех случаях.
  • Возврат:<true>если замена имела место,<false>в противном случае.
  • Сложность:О(R(n)).
  • Безопасность исключения:Сильная. Если какое-либо пользовательское действие приводит к исключению, то<bimap>, к которому относится заданный вид, остается в исходном состоянии.
template< class CompatibleData >
bool replace_data(iterator position, const CompatibleData & x);
  • Требуется:<position>является действительным сносным итератором заданного вида.<CompatibleKey>может быть присвоено<mapped_type>.
  • Эффекты:Назначает значение<x>на<e.second>, где<e>является элементом, на который указывает<position>в<bimap>, которому принадлежит заданный вид, если замена допускается всеми другими видами<bimap>.
  • Условия:Действительность положения сохраняется во всех случаях.
  • Возврат:<true>если замена имела место,<false>в противном случае.
  • Сложность:О(R(n)).
  • Безопасность исключения:Сильная. Если какое-либо пользовательское действие приводит к исключению, то<bimap>, к которому относится заданный вид, остается в исходном состоянии.
template< class KeyModifier >
bool modify_key(iterator position, KeyModifier mod);
  • Требуется:<KeyModifier>является модельюУнарной функции, принимающей аргументы типа:<key_type&>;<position>является действительным сносным итератором представления.
  • Эффекты:Звонки<mod(e.first)>, где e является элементом, указанным положением, и перестраивает<*position>во все представления<bimap>. Если перегруппировка не удается, элемент стирается. Успешно, если перегруппировка разрешена всеми другими взглядами<bimap>.
  • Последующие условия:Срок действия<position>сохраняется, если операция увенчается успехом.
  • Возврат:<true>, если операция удалась,<false>в противном случае.
  • Сложность:O(M(n)).
  • Безопасность исключения:Базовая. Если исключение выбрасывается какой-либо пользовательской операцией (за исключением, возможно, мода), то элемент, указанный позицией, стирается.
  • Примечание:Предоставляется только для просмотра карт.
template< class DataModifier >
bool modify_data(iterator position, DataModifier mod);
  • Требует:<DataModifier>является модельюУнарной функции, принимающей аргументы типа:<mapped_type&>;<position>является действительным итератором представления.
  • Эффекты:Звонки<mod(e.second)>, где e — элемент, на который указывает положение, и перегруппировка<*position>во все виды<bimap>. Если перегруппировка не удается, элемент стирается. Успешно, если перегруппировка разрешена всеми другими взглядами<bimap>.
  • Последующие условия:Срок действия<position>сохраняется, если операция увенчается успехом.
  • Возврат:<true>, если операция удалась,<false>в противном случае.
  • Сложность:O(M(n)).
  • Безопасность исключения:Базовая. Если исключение выбрасывается какой-либо пользовательской операцией (за исключением, возможно, мода), то элемент, указанный позицией, стирается.
  • Примечание:Предоставляется только для просмотра карт.

<vector_of>просмотры повторяют интерфейс<list_of>просмотров, который, в свою очередь, включает в себя операции списка, предусмотренные<std::list>. Синтаксис и поведение этих операций точно соответствуют представлениям<list_of>, но связанные с ними границы сложности в целом различаются.

void splice(iterator position, this_type & x);
  • Требуется:<position>является действительным итератором представления. 492.
  • Эффекты:Вставить содержимое<x>перед положением в том же порядке, в каком оно было в<x>. Удачно вставленные элементы стираются из<x>.
  • Сложность:O(shl(end()-position,x.size()) + x.size()*I(n+x.size()) + x.size()*D(x.size())).
  • Безопасность исключения:Базовая.
void splice(iterator position, this_type & x,iterator i);
  • Требуется:<position>является действительным итератором представления.<i>является допустимым итератором<x>.
  • Эффекты:Включить элемент, указанный<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>, то не хроу; в противном случае сильный.
void splice(iterator position, this_type & x, iterator first, iterator last);
  • Требуется:<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>, не хроу; в противном случае, базовая.
void remove(const value_type & value);
  • Эффекты:Стирает все элементы представления, которые сравниваются равными<value>.
  • Сложность:O(n + m*D(n)), где m — число стертых элементов.
  • Безопасность исключения:Базовая.
template< class Predicate >
void remove_if(Predicate pred);
  • Эффекты:Стирает все элементы<x>вида, для которого<pred(x)>удерживает.
  • Сложность:O(n + m*D(n)), где m — число стертых элементов.
  • Безопасность исключения:Базовая.
void unique();
  • Эффекты:Устраняет все, кроме первого элемента, из каждой последовательной группы равных элементов, указанных итератором<i>в диапазоне<[first+1,last)>, для которого<*i==*(i-1)>.
  • Сложность:O(n + m*D(n)), где m — число стертых элементов.
  • Безопасность исключения:Базовая.
template< class BinaryPredicate >
void unique(BinaryPredicate binary_pred);
  • Эффекты:Устраняет все, кроме первого элемента, из каждой последовательной группы элементов, указанных итератором i в диапазоне<[first+1,last)>, для которого<binary_pred(*i,*(i-1))>удерживает.
  • Сложность:O(n + m*D(n)), где m — число стертых элементов.
  • Безопасность исключения:Базовая.
void merge(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>, не хроу; в противном случае, базовая.
template< class Compare >
void merge(this_type & x, Compare comp);
  • <Compare>являетсястрогим слабым заказомпо<value_type>. И вид, и<x>сортируются по комп.
  • Эффекты:Попытки вставить каждый элемент<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>, не хроу; в противном случае, базовая.
void sort();
  • Требует:<std::less<value_type>>— этострогий слабый порядокнад<value_type>.
  • Эффекты:Сортирует вид по<std::less<value_type>>. Сортировка стабильна, т.е. эквивалентные элементы сохраняют свое относительное положение.
  • Условия:Сохраняется достоверность итераторов и ссылок.
  • Сложность:O(n*log(n)).
  • Безопасность исключения:Базовая.
template< class Compare >
void sort(Compare comp);
  • Требуется:Сравнитестрогий слабый заказс<value_type>.
  • Эффекты:Сортирует вид по<comp>. Сортировка стабильна, т.е. эквивалентные элементы сохраняют свое относительное положение.
  • Условия:Сохраняется достоверность итераторов и ссылок.
  • Сложность:O(n*log(n)).
  • Безопасность исключения:Базовая.
void reverse();
  • Эффекты:Обратный порядок элементов в представлении.
  • Условия:Сохраняется достоверность итераторов и ссылок.
  • Сложность:O(n).
  • Безопасность исключения:нехроу.

Эти операции без аналога в<std::list>(хотя сплайс обеспечивает частично перекрывающуюся функциональность), выполняют индивидуальное и глобальное перепозиционирование элементов внутри индекса.

void relocate(iterator position, iterator i);
  • <position>является действительным итератором представления.<i>является действительным итератором представления.
  • Эффекты:Вставить элемент, указанный<i>до<position>. Если<position==i>не выполняется операция.
  • Пост-условия:Итератор или ссылка не являются недействительными.
  • Сложность:Постоянство.
  • Безопасность исключения:нехроу.
void relocate(iterator position, iterator first, iterator last);
  • Требуется:<position>является действительным итератором представления.<first>и<last>являются действительными итераторами представления.<last>достижимо от<first>.<position>не находится в пределах<[first,last)>.
  • Эффекты:Диапазон элементов<[first,last)>позиционируется непосредственно перед<position>.
  • Пост-условия:Итератор или ссылка не являются недействительными.
  • Сложность:Постоянство.
  • Безопасность исключения:нехроу.

Виды не могут быть сериализованы сами по себе, но только как часть<bimap>, в которую они встроены. При описании дополнительных предварительных условий и гарантий, связанных с<vector_of>представлениями в отношении сериализации их встраиваемых контейнеров, мы используем понятия, определенные в разделе сериализации<bimap>.

  • Требуется:Никаких дополнительных требований к контейнерам.
  • Требуется:Никаких дополнительных требований к контейнерам.
  • Пост-условия:При успешной погрузке каждый из элементов<[begin(), end())>представляет собой восстановленную копию соответствующего элемента в<[m.get<i>().begin(),m.get<i>().end())>, где<i>- положение<vector_of>вида в контейнере.
  • Требуется:<it>является действительным итератором представления. При этом<bimap>он был спасен.
  • Постусловия:При удачной погрузке, если она была сносной, то<*it>' является восстановленной копией<*it>, в противном случае<it><==end()>.
  • Примечание:Допускается, что это<const_iterator>и восстановленный<it><iterator>, или наоборот.

PrevUpHomeNext

Статья vector_of Reference раздела Chapter 1. Boost.Bimap Reference может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Reference ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 03:50:14/0.015126943588257/1