Juce: контейнеры
Содержание:
1. Введение;
2.Контейнеры (Вы читаете данный раздел);
3. Многопоточность;
4. Проекты, использующие Juce;
5. Впечатления и выводы.
Наиболее общим контейнерным классом в Juce является Array, который очень похож на std::vector. Объекты, которые можно хранить в этом контейнере, обязаны иметь конструктор копирования и оператор присваивания, как и в случае std::vector, однако кроме этого они должны быть перемещаемыми (не содержать внутренних указателей на свои составные части). Это требование даже строже, чем требования в STL, не говоря уже о контейнерах NTL в U++, где можно хранить вообще что угодно. Зачем нужна такая излишняя строгость - непонятно. Создаются объекты Array привычным для С++ образом, однако названия методов отличаются от принятых в STL.
В Juce нет концепций итераторов и алгоритмов, как в STL. Вместо этого некоторые алгоритмы реализованы как методы самого контейнера. Например, getFirst() и getLast() возвращают ссылки на первый и последний элемент контейнера, indexOf() -находит индекс переданного элемента, swapWithArray() - меняет два массива местами. Метод removeValuesIn(arr) удаляет из массива все элементы, имеющиеся в другом массиве, sort() - сортирует массив согласно заданному критерию сортировки, который передается в его первом параметре.
Критерий сортировки должен передаваться как объект, реализующий метод:
Выглядит такой подход очень громоздко и нерационально.
Для хранения ссылок на объекты в Juce есть два специализированных класса: OwnedArray и ReferenceCountedArray. Первый из них используется для хранения указателей на объекты, «владельцем» которых является сам контейнер. При удалении элемента объект также будет корректно удален. Второй контейнер хранит объекты, унаследованные от ReferenceCountedObject, и управляет подсчетом ссылок для них. Когда счетчик ссылок обнуляется, объект уничтожается.
В GUI-приложениях очень часто нужно хранить списки строк. Для этого предусмотрен специальный контейнер StringArray. Он содержит ряд специфических методов, которые облегчают рутинные операции с такими списками. Например, addIfNotAlready There() добавляет строку, если ее еще нет в списке, а addTokens() разбивает строку на «слова» согласно переданным разделителям и «кавычкам» и добавляет все получившиеся строки в список. Метод joinIntoString() «собирает» список в единую строку, removeDuplicates() - удаляет строки-дубликаты и т.д.
Как ни странно, в Juce нет обобщенных ассоциативных контейнеров. Есть только класс StringPairArray, которые индексирует список строк строковыми ключами. Нет также никаких других контейнеров - ни деревьев, ни стеков, ни очередей. К счастью, использовать STL в Juce никто не запрещает.
Планируете приступить к изучению библиотеки Juce сразу же после того, как закончите строительство своего загородного дома? Окна для коттеджей (http://za-okna.ru/dlya-kottedzhej/) я рекомендую Вам приобрести в проверенной компании, которая поставляет качественную продукцию. На ее роль идеально подойдет фирма «Ваши окна»!
1. Введение;
2.
3. Многопоточность;
4. Проекты, использующие Juce;
5. Впечатления и выводы.
Наиболее общим контейнерным классом в Juce является Array, который очень похож на std::vector. Объекты, которые можно хранить в этом контейнере, обязаны иметь конструктор копирования и оператор присваивания, как и в случае std::vector, однако кроме этого они должны быть перемещаемыми (не содержать внутренних указателей на свои составные части). Это требование даже строже, чем требования в STL, не говоря уже о контейнерах NTL в U++, где можно хранить вообще что угодно. Зачем нужна такая излишняя строгость - непонятно. Создаются объекты Array привычным для С++ образом, однако названия методов отличаются от принятых в STL.
В Juce нет концепций итераторов и алгоритмов, как в STL. Вместо этого некоторые алгоритмы реализованы как методы самого контейнера. Например, getFirst() и getLast() возвращают ссылки на первый и последний элемент контейнера, indexOf() -находит индекс переданного элемента, swapWithArray() - меняет два массива местами. Метод removeValuesIn(arr) удаляет из массива все элементы, имеющиеся в другом массиве, sort() - сортирует массив согласно заданному критерию сортировки, который передается в его первом параметре.
Критерий сортировки должен передаваться как объект, реализующий метод:
int compareElements (ElementType first, ElementType second);
Выглядит такой подход очень громоздко и нерационально.
Для хранения ссылок на объекты в Juce есть два специализированных класса: OwnedArray и ReferenceCountedArray. Первый из них используется для хранения указателей на объекты, «владельцем» которых является сам контейнер. При удалении элемента объект также будет корректно удален. Второй контейнер хранит объекты, унаследованные от ReferenceCountedObject, и управляет подсчетом ссылок для них. Когда счетчик ссылок обнуляется, объект уничтожается.
В GUI-приложениях очень часто нужно хранить списки строк. Для этого предусмотрен специальный контейнер StringArray. Он содержит ряд специфических методов, которые облегчают рутинные операции с такими списками. Например, addIfNotAlready There() добавляет строку, если ее еще нет в списке, а addTokens() разбивает строку на «слова» согласно переданным разделителям и «кавычкам» и добавляет все получившиеся строки в список. Метод joinIntoString() «собирает» список в единую строку, removeDuplicates() - удаляет строки-дубликаты и т.д.
Как ни странно, в Juce нет обобщенных ассоциативных контейнеров. Есть только класс StringPairArray, которые индексирует список строк строковыми ключами. Нет также никаких других контейнеров - ни деревьев, ни стеков, ни очередей. К счастью, использовать STL в Juce никто не запрещает.
Планируете приступить к изучению библиотеки Juce сразу же после того, как закончите строительство своего загородного дома? Окна для коттеджей (http://za-okna.ru/dlya-kottedzhej/) я рекомендую Вам приобрести в проверенной компании, которая поставляет качественную продукцию. На ее роль идеально подойдет фирма «Ваши окна»!