Ultimate ++: бібліотека контейнерів ntl

Відео: Річард Баранюк про open-source освіті

Ultimate ++: бібліотека контейнерів NTL
У своєму прагненні радикально змінити підхід до програмування 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 lt; lt; 5 lt; lt; l lt; lt; l23- // Додати елементи в кінець вектора
// Вставити елемент «l0» перед елементом з індексом l
v.Insert (l, l0);
// Доступ за індексом оператором [] і число елементів
for (int i = 0 i lt; v.GetCount () - LOG (v [i]) -
// Видалення елемента за індексом
v.Remove (2) -

Функцію LOG зручно використовувати при налагодженні. Існує і аналогічна функція DUMP, додатково показує саме передане їй вираз, а не тільки його результат. Метод 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);
}

Ultimate ++: бібліотека контейнерів NTL

Самим нетривіальним моментом в NTL є присвоювання контейнерів, при якому відбувається не копіювання, а переміщення елементів:
Vector v, u-
v lt; lt; l lt; lt; 2 lt; lt; 3
u = v;
LOG (v [0]) - // Помилка! Вектор v вже порожній!

Для копіювання потрібно використовувати оператор «lt; lt; =»:
u lt; lt; = v- // Глибоке копіювання
LOG (v [0]) - // Працює!

Подібна семантика дозволяє збільшити продуктивність контейнерів, але часто суперечить виробленої у програмістів на З ++ інтуїції і вимагає звикання.

Якщо контейнери NTL краще і швидше, ніж в STL, то алгоритми NTL розчаровують. Мені так і не вдалося знайти аналогів багатьох корисних алгоритмів STL (наприклад, unique). Крім того, алгоритми працюють з контейнерами як з цілим, а передати алгоритму діапазон елементів неможливо. Справедливий-вості заради потрібно сказати, що для переважної більшості завдань ці обмеження несуттєві, але все ж NTL далеко не так повна і продумана, як STL.

В наступній частині статті будуть розглянуті інші цікаві особливості і можливості U ++.



Ось і все з Ultimate ++ ми на сьогодні закінчили, а тепер давайте поговоримо про ніссан автозапчастини (https://autovladivostok.ru/parts_cat.php?marka=NISSAN)! А придбати їх за максимально вигідною для себе ціною надзвичайно просто! Все, що Вам для цього потрібно зробити, це відвідати сайт autovladivostok.ru!

ІНШЕ

Ultimate ++: sqlexp фото

Ultimate ++: sqlexp

Відео: N ++: Intro tab invisible ninja speedrun in 35:04 Поки робота з SQL в U ++ виглядає настільки ж нудною, як і в…

Juce: контейнери фото

Juce: контейнери

Відео: Batman Arkham City. Серія 16 [2-ий контейнер з титаном. глушилка] Найбільш загальним контейнерним класом в Juce…

Нові функції windows server 2016 фото

Нові функції windows server 2016

Контейнери Windows Server і контейнери Hyper-V Наступне важливе зміна в Windows Server 2016 відноситься до контейнерів.…

Juce: враження і висновки фото

Juce: враження і висновки

Відео: Малайзійка на підлогу шишечки - NASTY Juice! Бібліотека Juce виробляє двояке враження. Багато її можливості…

Взаємодія chaiscript з c ++ фото

Взаємодія chaiscript з c ++

Відео: Jason Turner: Why and How To Add ScriptingІдеологія взаємодії ChaiScript і С ++ Скриптова мова ChaiScript…

У чому зберігати їжу фото

У чому зберігати їжу

Відео: Теорія змови - Як зберігати продукти. Модні новинки. Випуск від 12.02.2017Будь-яка господиня знає, що…

» » Ultimate ++: бібліотека контейнерів ntl