Ultimate++: библиотека контейнеров NTL
Содержание:
1. Реакция на события и логика программы;
2. Использование компоновок;
3. Иерархия виджетов в U++;
4.Библиотека контейнеров NTL (Вы читаете данный раздел).
В своем стремлении радикально изменить подход к программированию U++ не щадит даже стандартную библиотеку STL. Вместо нее используется несовместимый аналог собственной разработки - NTL, имеющий целый ряд интересных особенностей. Существуют два сорта (flavors) контейнеров NTL: векторы (Vector) и массивы (Array). Есть, например, ассоциативный контейнер «векторного сорта» VectorMap и аналогичный контейнер «массивного сорта» ArrayMap. Контейнеры-векторы работают очень быстро, но требуют, чтобы хранящиеся данные «могли перемещаться» (Movable). В массивах же можно хранить абсолютно любые типы данных за счет некоторого снижения производительности. Объекты перемещаемых типов не должны хранить указатели или ссылки на себя, или свои элементы в каком-либо виде, при этом не должны иметь виртуальных методов или виртуальных базовых классов. Это требование намного мягче ограничений, накладываемых контейнерами STL, которые требуют наличия конструктора копирования и оператора присваивания. В результате, в контейнерах NTL можно хранить, например, сами виджеты, а не ссылки на них, как в STL.
Разработчики U++ утверждают, что в целом контейнеры-векторы NTL в 3-4 раза быстрее своих аналогов из STL, а для некоторых операций (например, вставка элемента в середину контейнера) выигрыш доходит до 10 раз. Кроме того, абсолютно все контейнеры NTL поддерживают случайный доступ по индексу, а доступ с помощью итераторов возможен, но настоятельно не поощряется. Все контейнеры и алгоритмы описаны в заголовочном файле Core.h, поэтому включать заголовки для каждого типа контейнеров, как в STL, не нужно.
Начнем с простейшего примера - вектора целых чисел:
Функцию LOG удобно использовать при отладке. Существует и аналогичная функция DUMP, дополнительно показывающая само переданное ей выражение, а не только его результат. Метод At возвращает элемент с заданным индексом. Если такого элемента нет, то в контейнер добавится нужное число элементов, чтобы его создать. Новые элементы инициализируются вторым параметром:
Ассоциативные контейнеры в NTL также имеют ряд интересных особенностей:
Самым нетривиальным моментом в NTL является присваивание контейнеров, при котором происходит не копирование, а перемещение элементов:
Для копирования нужно использовать оператор «<<=»:
Подобная семантика позволяет увеличить производительность контейнеров, но зачастую противоречит выработанной у программистов на С++ интуиции и требует привыкания.
Если контейнеры NTL лучше и быстрее, чем в STL, то алгоритмы NTL разочаровывают. Мне так и не удалось найти аналогов многих полезных алгоритмов STL (например, unique). Кроме того, алгоритмы работают с контейнерами как с целым, а передать алгоритму диапазон элементов невозможно. Справедли-вости ради нужно сказать, что для подавляющего большинства задач эти ограничения несущественны, но все же NTL далеко не так полна и продумана, как STL.
В следующей части статьи будут рассмотрены другие интересные особенности и возможности U++.
Вот и все с Ultimate++ мы на сегодня закончили, а теперь давайте поговорим про ниссан автозапчасти (http://autovladivostok.ru/parts_cat.php?marka=NISSAN)! А приобрести их по максимально выгодной для себя цене чрезвычайно просто! Все, что Вам для этого потребуется сделать, это посетить сайт autovladivostok.ru!
1. Реакция на события и логика программы;
2. Использование компоновок;
3. Иерархия виджетов в U++;
4.
В своем стремлении радикально изменить подход к программированию U++ не щадит даже стандартную библиотеку STL. Вместо нее используется несовместимый аналог собственной разработки - NTL, имеющий целый ряд интересных особенностей. Существуют два сорта (flavors) контейнеров NTL: векторы (Vector) и массивы (Array). Есть, например, ассоциативный контейнер «векторного сорта» VectorMap и аналогичный контейнер «массивного сорта» ArrayMap. Контейнеры-векторы работают очень быстро, но требуют, чтобы хранящиеся данные «могли перемещаться» (Movable). В массивах же можно хранить абсолютно любые типы данных за счет некоторого снижения производительности. Объекты перемещаемых типов не должны хранить указатели или ссылки на себя, или свои элементы в каком-либо виде, при этом не должны иметь виртуальных методов или виртуальных базовых классов. Это требование намного мягче ограничений, накладываемых контейнерами STL, которые требуют наличия конструктора копирования и оператора присваивания. В результате, в контейнерах NTL можно хранить, например, сами виджеты, а не ссылки на них, как в STL.
Разработчики U++ утверждают, что в целом контейнеры-векторы NTL в 3-4 раза быстрее своих аналогов из STL, а для некоторых операций (например, вставка элемента в середину контейнера) выигрыш доходит до 10 раз. Кроме того, абсолютно все контейнеры NTL поддерживают случайный доступ по индексу, а доступ с помощью итераторов возможен, но настоятельно не поощряется. Все контейнеры и алгоритмы описаны в заголовочном файле Core.h, поэтому включать заголовки для каждого типа контейнеров, как в STL, не нужно.
Начнем с простейшего примера - вектора целых чисел:
#include
Vector v;
v.Add(l23); // Добавить элемент в конец вектора
v << 5 << l << l23; // Добавить элементы в конец вектора
// Вставить элемент «l0» перед элементом с индексом l
v.Insert(l, l0);
// Доступ по индексу оператором [] и число элементов
for(int i = 0; i < v.GetCount(); LOG(v[i]);
// Удаление элемента по индексу
v.Remove(2);
Vector
v.Add(l23); // Добавить элемент в конец вектора
v << 5 << l << l23; // Добавить элементы в конец вектора
// Вставить элемент «l0» перед элементом с индексом l
v.Insert(l, l0);
// Доступ по индексу оператором [] и число элементов
for(int i = 0; i < v.GetCount(); LOG(v[i]);
// Удаление элемента по индексу
v.Remove(2);
Функцию LOG удобно использовать при отладке. Существует и аналогичная функция DUMP, дополнительно показывающая само переданное ей выражение, а не только его результат. Метод At возвращает элемент с заданным индексом. Если такого элемента нет, то в контейнер добавится нужное число элементов, чтобы его создать. Новые элементы инициализируются вторым параметром:
// Добавить элементы до 20 включительно со значениями 100
v.At(20,100);
v.At(20,100);
Ассоциативные контейнеры в NTL также имеют ряд интересных особенностей:
VectorMap m;
m.Add("One",l); // Добавляем элементы
m.Add("Two",2);
m.Add("Five",5);
// Доступ к ключу и значению по индексу
for(int i = 0; i = 0) {
LOG( m[q] );
q = m.FindNext(q);
}
m.Add("One",l); // Добавляем элементы
m.Add("Two",2);
m.Add("Five",5);
// Доступ к ключу и значению по индексу
for(int i = 0; i = 0) {
LOG( m[q] );
q = m.FindNext(q);
}
Самым нетривиальным моментом в NTL является присваивание контейнеров, при котором происходит не копирование, а перемещение элементов:
Vector v,u;
v << l << 2 << 3;
u = v;
LOG(v[0]); // Ошибка! Вектор v уже пуст!
v << l << 2 << 3;
u = v;
LOG(v[0]); // Ошибка! Вектор v уже пуст!
Для копирования нужно использовать оператор «<<=»:
u <<= v; // Глубокое копирование
LOG(v[0]); // Работает!
LOG(v[0]); // Работает!
Подобная семантика позволяет увеличить производительность контейнеров, но зачастую противоречит выработанной у программистов на С++ интуиции и требует привыкания.
Если контейнеры NTL лучше и быстрее, чем в STL, то алгоритмы NTL разочаровывают. Мне так и не удалось найти аналогов многих полезных алгоритмов STL (например, unique). Кроме того, алгоритмы работают с контейнерами как с целым, а передать алгоритму диапазон элементов невозможно. Справедли-вости ради нужно сказать, что для подавляющего большинства задач эти ограничения несущественны, но все же NTL далеко не так полна и продумана, как STL.
В следующей части статьи будут рассмотрены другие интересные особенности и возможности U++.
Вот и все с Ultimate++ мы на сегодня закончили, а теперь давайте поговорим про ниссан автозапчасти (http://autovladivostok.ru/parts_cat.php?marka=NISSAN)! А приобрести их по максимально выгодной для себя цене чрезвычайно просто! Все, что Вам для этого потребуется сделать, это посетить сайт autovladivostok.ru!