Файлы STL: что они из себя представляют и как их использовать

Файлы STL: что они из себя представляют и как их использовать Расшифровка

Что такое формат файла stl

Простое для понимания определение формата файла STL объясняет его как треугольное представление трехмерного объекта. Если вы посмотрите на изображение, чертеж САПР использует плавные линии окружности, а чертеж STL показывает поверхность этого круга в виде серии соединенных треугольников.

Как вы можете видеть на фотографии/чертеже, полный файл САПР круга будет выглядеть, как круг, но версия STL представляет собой набор или сетку треугольников, заполняющих это пространство, чтобы проект был пригоден для печати большинством 3D принтеров.

3D-принтеры работают с файлами в формате STL. Большинство программных 3D-пакетов, таких как AutoCAD, SolidWorks, Pro/Engineer (теперь это PTC Creo Parametric), помимо прочего, могут создавать STL-файлы самостоятельно или с помощью дополнительного инструмента.

Следует отметить, что помимо .STL существует несколько других основных форматов файлов 3D-печати. К ним относятся .OBJ, .AMF, .PLY и .WRL. Для тех из вас, кому не нужно рисовать или создавать файл STL, есть много бесплатных программ просмотра или чтения STL.

Основные значения stl

На следующем изображении представлены наиболее часто используемые значения STL. Вы можете записать файл изображения в формате PNG для автономного использования или отправить его своим друзьям по электронной почте.Если вы являетесь веб-мастером некоммерческого веб-сайта, пожалуйста, не стесняйтесь публиковать изображение определений STL на вашем веб-сайте.

Что такое «плохой» файл stl

Хороший файл STL должен соответствовать двум правилам. Первое правило гласит, что смежные треугольники должны иметь две общие вершины. Во-вторых, ориентация треугольников (какая сторона треугольника входит, а какая сторона выходит), как указано вершинами и нормалями, должна совпадать. Если ни один из этих двух критериев не выполняется, файл STL относится к плохим…

Часто STL-файл можно назвать «плохим» из-за проблем с преобразованием. Во многих системах САПР число треугольников, представляющих модель, может быть определено пользователем. Если создано слишком много треугольников, размер STL-файла может стать неуправляемым.

Stl сегодня:

Файл модели для стереолитографии (одной из первых технологий быстрого прототипирования, появившейся в 1984 году) является аббревиатурой английского термина – Stereolithography (stl).

Каждая фигура представляется в виде множества треугольников, соединенных между собой вершинами. Чем больше треугольников, тем реалистичнее получается изображение, а поверхность однороднее. Небольшое количество треугольников дают эффект пиксилизации, только не в двухмерной, а в трехмерной реализации.

Сегодня файлы с таким расширением могут быть представлены двумя типами:

Текстовый файл подходит для небольших моделей. Его преимущество – простой и понятный язык программирования. Бинарный файл лучше использовать для объемных моделей. Разница в весе почти в два раза.

Еще играет важную роль синтаксис, используемый в файле. Выделяют новый и старый синтаксис или стандартный и нестандартный варианты. Некоторые программы могут читать и работать только с файлами, написанными с применением классического синтаксиса, а ряд более современных разработок без проблем понимает и новый, упрощенный код.

String и wstring

Все, что говорится о контейнере string, в равной степени относится и к wstring, его аналогу с расширенной кодировкой символов. Соответственно, любые упоминания о связи между string и char или char* относятся и к связи между wstring и wchar_t или wchar_t*.

Иначе говоря, отсутствие специальных упоминаний о строках с расширенной кодировкой символов не означает, что в STL они не поддерживаются. Контейнеры string и wstring являются специализациями одного шаблона basic_string.

Vector

Самая часто используемая коллекция — это вектор. Очень удобно, что у этой коллекции есть такой же оператор operator [], что и у обычного массива. Такой же оператор есть и у коллекций map, deque, string и wstring.

Важно понимать, что вместимость vector’а изменяется динамически. Обычно для увеличения размера используется мультипликативный подход: выделенная под vector память увеличивается при необходимости в константное число раз, т.е. если добавление нового элемента приведет к тому, что размер массива превысит вместимость, то операционной системой для программы будет выделен новый участок памяти, например, в два раза больший, в который будут скопированы все значения из старого участка памяти и к которому будет дописано новое значение.

Алгоритмы

Разработчики библиотеки STL ставили перед собой гораздо более серьезную задачу, чем создание библиотеки с набором шаблонных структур данных. STL содержит огромный набор оптимальных реализаций популярных алгоритмов, позволяющих работать с STL-коллекциями. Все реализованные функции можно поделить на три группы:

  • Методы перебора всех элементов коллекции и их обработки: count, count_if, find, find_if, adjacent_find, for_each, mismatch, equal, search copy, copy_backward, swap, iter_swap, swap_ranges, fill, fill_n, generate, generate_n, replace, replace_if, transform, remove, remove_if, remove_copy, remove_copy_if, unique, unique_copy, reverse, reverse_copy, rotate, rotate_copy, random_shuffle, partition, stable_partition
  • Методы сортировки коллекции: sort, stable_sort, partial_sort, partial_sort_copy, nth_element, binary_search, lower_bound, upper_bound, equal_range, merge, inplace_merge, includes, set_union, set_intersection, set_difference, set_symmetric_difference, make_heap, push_heap, pop_heap, sort_heap, min, max, min_element, max_element, lexographical_compare, next_permutation, prev_permutation
  • Методы выполнения определенных арифметических операций над членами коллекций: Accumulate, inner_product, partial_sum, adjacent_difference

Задачей этой статьи является лишь познакомить читателя с богатым набором инструментов, предоставляемых библиотекой STL. Более подробную информацию можно узнать из соответствующей документации.

Буквенная маркировка на обоях

Важной характеристикой обоев является материал, из которого они изготовлены. Для его обозначения служит буквенная маркировка обоев. Кроме того, буквенные обозначения могут указывать на дополнительные свойства поверхности. Основные буквенные обозначения:

СимволРасшифровкаКраткое описание
А

Акрил

Обои на бумажной основе, поверх которых нанесен вспененный слой акрила

Б

Бумага

Бумажные обои – наиболее популярный и доступный по стоимости вид обоев. Различаются — однослойные, многослойные и моющиеся бумажные обои

ВВ

Вспененный винил

Обои, изготовленные из вспененного винила. Имеют характерную объемную и рельефную поверхность

ПВ

Плоский винил

Обои из винила с плоским рельефом, подвергшиеся дополнительному прессованию

РВ

Рельефный или текстурный винил на основе флизелина

Обои изготовлены из винила на флизелиновой основе. Такие обои имеют рельефный рисунок

СТР

Структурные под покраску

Обои под покраску со структурированным рельефом, изготовленные из бумаги или флизелина

СТЛ

Стеклообои

Обои, изготовленные из стекловолокна. Эти обои также используются для окрашивания и имеют высокие показатели прочности, экологичности и пожаробезопасности

ТКС

Текстиль

Текстильные обои на основе тканевых волокон

В чем разница между «stl» и «стандартной библиотекой c «?

«STL»написал Александр Степанов в дни задолго до стандартизации C . C существовал до 80-х годов, но то, что мы сейчас называем «C » — язык, стандартизированный в ISO/IEC 14882:2022 (и более ранних версиях, таких как ISO / IEC 14882:2022).

STL уже широко использовался в качестве библиотеки для C , предоставляя программистам доступ к контейнерам, итераторам и алгоритмам. Когда произошла стандартизация, языковой комитет разработал разделы стандартная библиотека C (которая является частью языкового стандарта) для очень близко соответствуют STL.

на протяжении многих лет многие люди, включая известных авторов книг и различные веб — сайты, продолжали ссылаться на стандартную библиотеку C как «STL», несмотря на то, что эти два объекта разделены и что есть некоторые различия. Эти различия еще более выражены в новом стандарте C , которая включает в себя различные особенности и значительно изменяет некоторые классы.

исходный STL теперь часто называют «реализацией стандартной библиотеки шаблонов C » (скорее назад к реальной истории!), так же, как Ваша Microsoft Visual Studio или GCC поставляется реализация стандартной библиотеки C . Но «стандартная библиотека шаблонов» и «стандартная библиотека» — это не одно и то же.

битва заключается в том, должна ли текущая стандартная библиотека называться » STL » в полностью или частично, и/или имеет ли значение, как это называется.

для «STL»

существует школа мысли, которая говорит, что теперь все знают, что» STL «означает стандартную библиотеку, так же, как теперь все знают, что» C » является ISO-стандартизированным языком.

Он также включает в себя тех, кто верит, что неважно пока все стороны понимают, о чем идет речь.

Это термин, даже более распространен по природе зверя, большая часть которого широко использует функцию C , известную как «шаблоны».

для «стандартной библиотеки C » (или stdlib)

однако есть еще одна школа мысли, к которой я присоединяюсь, которая говорит, что это сбивает с толку. Люди, изучающие C в первый раз не знать это различие, и может не заметить небольшие языковые различия.

автор этой статьи имеет многочисленные раз встречались люди, которые считают, что вся стандартная библиотека C is STL, включая функции, которые никогда не были частью самого STL. Большинство вокальных сторонников «STL», напротив, точно знают, что они подразумевают под этим, и отказываются верить, что не все»получают это». Очевидно, что использование этого термина неоднородно.

Другие сокращения:  Моторное масло 10w30: SAE, API расшифровка

кроме того, есть некоторые STL-подобные библиотеки, которые на самом деле являются реализациями исходной STL, а не стандартной библиотеки C . До недавно STLPort был одним из них (и даже там,путаница бьет ключом!).

кроме того, стандарт C нигде не содержит текста «STL», а некоторые люди обычно используют фразы типа «STL is входит в стандартной библиотеке C «, что явно неверно.

Я считаю, что продолжение распространения использования этого термина таким образом просто приведет к недоразумению, продолжающемуся вечно. Увы, это может быть, совершенно контрпродуктивно пытаться что-то изменить, даже если это должно быть к лучшему. Возможно, мы просто застряли с двойным смыслом навсегда.

вывод

Я ценю, что этот пост был немного предвзят: я написал статью, на которую вы ссылались. 🙂 Во всяком случае, я надеюсь, что это поможет объяснить битву немного лучше.

обновление 13/04/2022

здесь триидеальныйпримеры того, кто использует «STL» для ссылки на всю стандартную библиотеку C . Меня по-прежнему озадачивает, что так много людей клянутся вслепую, что никто никогда этого не делает, когда это видно почти ежедневно.

Вопросы эффективности

Сначала я хотел включить в книгу отдельную главу, посвященную вопросам эффективности, но в итоге решил, что лучше оставить привычное деление на советы. Тем не менее многие советы посвящены минимизации затрат памяти и ресурсов на стадии исполнения. Для удобства ниже приводится краткое содержание «виртуальной главы», посвященной эффективности.

Совет 4. Вызывайте empty вместо сравнения size() с нулем

Совет 5. Используйте интервальные функции вместо одноэлементных

Совет 14. Используйте reserve для предотвращения лишних операций перераспределения памяти

Совет 15. Помните о различиях в реализации string

Совет 23. Рассмотрите возможность замены ассоциативных контейнеров сортированными векторами

Совет 24. Тщательно выбирайте между map::operator[] и map::insert

Совет 25. Изучите нестандартные хэшированные контейнеры

Совет 29. Рассмотрите возможность использования istreambuf_iterator при посимвольном вводе

Совет 31. Помните о существовании разных средств сортировки

Совет 44. Используйте функции контейнеров вместо одноименных алгоритмов

Совет 46. Передавайте алгоритмам объекты функций вместо функций

Все определения stl

Как упомянуто выше, вы увидите все значения STL в следующей таблице. Пожалуйста, знайте, что все определения перечислены в алфавитном порядке.Вы можете щелкнуть ссылки справа, чтобы увидеть подробную информацию о каждом определении, включая определения на английском и вашем местном языке.

Что означает stl в тексте

В общем, STL является аббревиатурой или аббревиатурой, которая определяется простым языком. Эта страница иллюстрирует, как STL используется в обмена сообщениями и чат-форумах, в дополнение к социальным сетям, таким как VK, Instagram, Whatsapp и Snapchat. Из приведенной выше таблицы, вы можете просмотреть все значения STL: некоторые из них образовательные термины, другие медицинские термины, и даже компьютерные термины. Если вы знаете другое определение STL, пожалуйста, свяжитесь с нами. Мы включим его во время следующего обновления нашей базы данных. Пожалуйста, имейте в информации, что некоторые из наших сокращений и их определения создаются нашими посетителями. Поэтому ваше предложение о новых аббревиатур приветствуется! В качестве возврата мы перевели аббревиатуру STL на испанский, французский, китайский, португальский, русский и т.д. Далее можно прокрутить вниз и щелкнуть в меню языка, чтобы найти значения STL на других 42 языках.

Графическая маркировка на обоях

Кроме буквенных маркировочных обозначений, на обоях также присутствуют специальные графические значки (пиктограммы). Они дают дополнительную информацию о способах поклейки обоев, характеристиках их эксплуатации, чувствительности к влаге, свету, механическим воздействиям, а также об особенностях декоративного рисунка, влияющих на подгонку и совмещение полотен друг с другом. Рассмотрим более подробно основные из них.

Дополнительная группа пиктограмм

Также на обоях могут быть нанесены обозначения, говорящие об их экологической безопасности и классе пожаробезопасности.

Обозначения экологической и пожарной безопасности на обояхОбозначения экологической и пожарной безопасности на обоях

Кроме того, обои, произведенные в странах ЕС, могут иметь специальные знаки в маркировке, например, Gütegemeinschaft Tapete e.V. Данной организацией были разработаны специальные предписания по качеству и проверке обоев, в которых обозначены технические требования, а также нормативы касающиеся безвредности для здоровья и окружающей среды.

Знак соответствия качества обоевЗнак соответствия качества обоев

Еще одним маркировочным знаком отвечающим требованиям директив ЕС является знак CE, применяемый для всей номенклатуры строительной и отделочной продукции. Знак СЕ, размещенный на этикетке обоев, означает, что производитель гарантирует, что качество данного продукта соответствует действующим на данный момент директивам ЕС, касающимся качества строительной продукции.

Законодательство ЕС весьма строгое в подобного рода вопросах, поэтому наличие таких обозначений на этикетке является дополнительным плюсом в пользу того или иного товара.

Знак CE для строительной продукции
Знак CE для строительной продукции

Важно! На каждом обойном рулоне, на упаковочной этикетке стоит дата выпуска и номер партии, иногда еще называемый номером замеса. Номер партии является важным для покупателя, так как обои из разных партий могут иметь существенные цветовые различия.

Номер партии на этикеткеНомер партии на этикетке

Итераторы

Очень важное понятие в реализации динамических структур данных — итератор. Неформально итератор можно определить как абстракцию, которая ведет себя как указатель, возможно, с какими-то ограничениями. Строго говоря, итератор — более общее понятие, и является объектной оберткой для указателя, поэтому указатель является итератором. Примерно его устройство может выглядеть так:

class Iterator
{ T* pointer; public: T* GetPointer () { return this - >pointer; } void SetPointer (T* pointer) { this - >pointer = pointer; }
};

Вот несколько формализованных определений итератора:

  • Итераторы обеспечивают доступ к элементам коллекции
  • Для каждого конкретного класса STL итераторы определяются отдельно внутри класса этой коллекции.

Существуют три типа итераторов:

  • (forward) iterator — для обхода коллекции от меньшего индекса к большему;
  • reverse iterator — для обхода коллекции от большего индекс к меньшему;
  • random access iterator — для обхода коллекции в любом направлении.

Вот пример использования итераторов для удаления половин элементов коллекции:

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void printInt (int number);
int _tmain (int argc, _TCHAR* argv [])
{ vector<int> myVec; vector<int>::iterator first, last; for (long i=0; i<10; i ) { myVec.push_back (i); } first = myVec.begin (); last = myVec.begin () 5; if (last >= myVec.end ()) { return - 1; } myVec.erase (first, last); for_each (myVec.begin (), myVec.end (), printInt); return 0;
}
void printInt (int number)
{
cout << number << endl;
}

Важно понимать, что при получении итератора на какой-то элемент коллекции и последующем изменении коллекции итератор может стать непригоден для использования.

Итерация вперед и аналогично назад происходит так:for (iterator element = begin (); element < end (); element ) { t = (*element); }

При использовании random access iterator, например, так:for (iterator element = begin (); element < end (); element =2) { t = (*element);}

Как открыть файл трёхмерной модели объекта:

Для работы с STL-форматом существуют специальные утилиты. Также можно использовать ряд CAD-программ. Текстовый файл можно открыть в простом блокноте, чтобы внести коррективы. При необходимости текстовый файл можно конвертировать в бинарный, используя специальные утилиты или те же CAD-программы. В большинстве случаев используется технология экспортирования и сохранения в нужном формате.

Самыми распространенными программными продуктами, которые могут работать с .STL, считаются:

Профессиональные программы существуют под большинство операционных систем. С STL форматом можно работать под Windows, Linux и MacOS.

Как появился формат:

Впервые формат stl  был представлен в 1987 году. Компания 3D Systems, начинающая свой путь на разработке технологии трехмерной печати, находилась в поиске решения для представления объемных моделей изделий, которые в последствие будут изготовлены на специальных станках.

Опубликованный вот уже более 30 лет назад, STL имел свободный код. Компания-разработчик пошла на такой шаг с умыслом — сделать формат распространенным и буквально всенародным. Так оно и вышло. Среди существующих разработчиков программных CAD продуктов, создающих профессиональное ПО для 3D моделирования и проектирования, практически все взяли новинку на вооружение и интегрировали со своими разработками.

Классификация по способу стыковки рисунка

Данная группа пиктограмм описывает способы стыковки обойных полотен при поклейке, исходя из расположения рисунка на них.

Классификация по степени влагостойкости

Данная группа пиктограмм на обоях характеризует их влагостойкость и износостойкость.

Классификация по устойчивости окраски к свету

Характеризует устойчивость обоев к выцветанию под действием солнечного света.

Коллекции

Для использования коллекции в своем коде используйте следующую директиву:

#include <T>,где T — название коллекции

Итак, наиболее часто используются:

  • vector — коллекция элементов, сохраненных в массиве, изменяющегося по мере необходимости размера (обычно, увеличивающегося);
  • list — коллекция, хранящая элементы в виде двунаправленного связанного списка;
  • map — коллекция, сохраняющая пары вида <const Key, T>, т.е. каждый элемент — это пара вида <ключ, значение>, при этом однозначная (каждому ключу соответствует единственное значение), где ключ — некоторая характеризующая значение величина, для которой применима операция сравнения; пары хранятся в отсортированном виде, что позволяет осуществлять быстрый поиск по ключу, но за это, естественно, придется заплатить: придется так реализовывать вставку, чтобы условие отсортированности не нарушилось;
  • set — это отсортированная коллекция одних только ключей, т.е. значений, для которых применима операция сравнения, при этом уникальных — каждый ключ может встретиться во множестве (от англ. set — множество) только один раз;
  • multimap — map, в котором отсутствует условие уникальности ключа, т.е. если вы произведете поиск по ключу, то получите не единственное значение, а набор элементов с одинаковым значением ключа; для использования в коде используется #include <map>;
  • multiset — коллекция с тем же отличием от set’а, что и multimap от map’а, т.е. с отсутствием условия уникальности ключа; для подключения: #include <set>.

Методы коллекций

Основными методами, присутствующими почти во всех коллекциях являются следующие:

  • empty — определяет, пуста ли коллекция;
  • size — возвращает размер коллекции;
  • begin — возвращает прямой итератор, указывающий на начало коллекции;
  • end — возвращает прямой итератор, указывающий на конец коллекции, т.е. на несуществующий элемент, идущий после последнего;
  • rbegin — возвращает обратный итератор на начало коллекции;
  • rend — возвращает обратный итератор на конец коллекции;
  • clear — очищает коллекцию, т.е. удаляет все ее элементы;
  • erase — удаляет определенные элементы из коллекции;
  • capacity — возвращает вместимость коллекции, т.е. количество элементов, которое может вместить эта коллекция (фактически, сколько памяти под коллекцию выделено);
Другие сокращения:  CHF: это какая валюта, обозначение, символ и история швейцарского франка

Вместимость коллекции, как было сказано в начале, меняется по мере надобности, т.е. если вся выделенная под коллекцию память уже заполнена, то при добавлении нового элемента вместимость коллекции будет увеличена, а все значения, бывшие в ней до увеличения, будут скопированы в новую область памяти — это довольно «дорогая» операция. Убедиться в том, что размер и вместимость — разные вещи, можно на следующем примере:

vector<int> vec;
cout << "Real size of array in vector: " << vec.capacity () << endl;
for (int j = 0; j < 10; j )
{ vec.push_back (10);
}
cout << "Real size of array in vector: " << vec.capacity () << endl;
return 0;

Назначение маркировки на обоях

Маркировка на обоях выполняет важную и полезную функцию – она заранее информирует покупателя о многих свойствах материала и особенностях поклейки обоев. Она позволяет сделать правильный выбор, а иногда и отказаться от покупки изделия, неподходящего по характеристикам или излишне сложного в монтаже. Для этого нужно разобраться, что означают символы, напечатанные на рулонной этикетке.

Определение, использование и расширение stl

У STL не существует официального определения, и разные авторы вкладывают в этот термин разный смысл. В этой книге термин «STL» относится к компонентам стандартной библиотеки C , работающим с итераторами. К этой категории относятся стандартные контейнеры (включая string), части библиотеки потоков ввода-вывода, объекты функций и алгоритмы.

В нее не входят адаптеры стандартных контейнеров (stack, queue и priorityqueue), контейнеры bitset и valarray, не поддерживающие итераторы, а также массивы. Хотя массивы поддерживают итераторы в форме указателей, они являются частью языка C , а не библиотеки.

С технической точки зрения в мое определение STL не входят расширения стандартной библиотеки C , в том числе хэшированные контейнеры, односвязные списки, контейнеры rope и различные нестандартные объекты функций. Несмотря на это, программистам STL следует помнить о существовании этих расширений, поэтому я упоминаю о них там, где это уместно.

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

На мой взгляд, сначала необходимо в совершенстве освоить существующие возможности STL. Этой теме и посвящена данная книга. Если вы решите заняться созданием STL-подобных компонентов, необходимую информацию можно будет найти в книгах Джосаттиса «The C Standard Library» [3] и Остерна «Generic Programming and the STL» [4].

Первое знакомство

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

Подсчет ссылок

При описании STL практически невозможно обойти стороной подсчет ссылок. Как будет показано в советах 7 и 33, любая архитектура, основанная на контейнерах указателей, практически всегда основана на подсчете ссылок. Кроме того, подсчет ссылок используется во многих внутренних реализациях string, причем, как показано в совете 15, это обстоятельство иногда приходится учитывать при программировании.

Предполагается, что читатель знаком с основными принципами работы механизма подсчета ссылок, а если не знаком — необходимую информацию можно найти в любом учебнике C среднего или высокого уровня. Например, в книге «More Effective C » соответствующий материал приведен в советах 28 и 29.

Потокобезопасность

Важно понимать, что STL — не потокобезопасная библиотека. Но решить эту проблему очень просто: если два потока используют одну коллекцию, просто реализуйте критическую секцию и Mutex.

Предикаты

Для многих алгоритмов STL можно задать условие, посредством которого алгоритм определит, что ему делать с тем или иным членом коллекции. Предикат — это функция, которая принимает несколько параметров и возвращает логическое значение (истина/ложь). Существует и набор стандартных предикатов.

Примеры

Книга содержит множество примеров. Все примеры комментируются по мере их приведения, и все же кое-что следует пояснить заранее.

Из приведенного выше примера с map видно, что я обычно опускаю директивы #include и игнорирую тот факт, что компоненты STL принадлежат пространству имен std. Полное определение m должно было выглядеть так:

#include <map>

#include <string>

using std::map;

using std::string;

map<string. double> m;

Но я предпочитаю оставить в примере лишь самое существенное. При объявлении формального параметра-типа шаблона вместо class используется ключевое слово typename. Иначе говоря, вместо конструкции вида

template <class T>

class Widget{…};

я использую конструкцию

template <typename T>

class Widget{…};

В данном контексте ключевые слова class и typename эквивалентны, но мне кажется, что слово typename более четко выражает важную мысль: подходит любой тип, T не обязательно является классом. Если вы предпочитаете объявлять параметры с ключевым словом class — пожалуйста. Выбор между typename и class в этом контексте зависит только от стиля.

Однако в других контекстах стиль не является единственным фактором. Во избежание потенциальных неоднозначностей лексического анализа (я избавлю вас от подробностей) имена типов, зависящие от формальных параметров шаблона, должны предваряться ключевым словом typename.

Такие типы называются зависимыми типами. Небольшой пример поможет вам лучше понять, о чем идет речь. Предположим, вы пишете шаблон функции, которая получает контейнер STL и возвращает результат проверки условия «последний элемент контейнера больше первого». Одно из возможных решений выглядит так:

template <typename С>

bool latGreaterThanFirst(const С& container) {

 if (container.empty()) return false;

 typename C::const_iterator begin(container.begin());

 typename C::const_iterator end(container.end());

 return *—end > *begin;

В этом примере локальные переменные begin и end относятся к типу C::const_iterator, зависящему от формального параметра C. Поскольку тип C::const_iterator является зависимым, перед ним должно стоять ключевое слово typename. Некоторые компиляторы принимают код без typename, но такой код не переносится на другие платформы.

Надеюсь, вы обратили внимание на жирный шрифт в приведенных примерах. Выделение должно привлечь ваше внимание к особенно важным фрагментам кода. Нередко таким образом подчеркиваются различия между похожими примерами, как, например, при демонстрации двух разных способов объявления параметра T в примере Widget.

Файлы STL: что они из себя представляют и как их использовать

В книге часто встречаются параметры lhs и rhs. Эти сокращения означают «left-hand side» («левая сторона») и «right-hand side» («правая сторона») соответственно, они особенно удобны при объявлении операторов. Пример из совета 19:

class Widget {…}:

bool operator==(const Widget& lhs, const Widgets rhs);

При вызове этой функции в контексте

if (х==у) // Предполагается, что х и у

// относятся к классу Widget

Объекту х, находящемуся слева от оператора ==, в объявлении operator==соответствует параметр lhs, а объекту у соответствует параметр rhs.

Что касается имени класса Widget, то оно не имеет никакого отношения к графическим интерфейсам или инструментариям. Этим именем я привык обозначать «некий класс, который что-то делает». Иногда (как, например, на с. 20) имя Widget относится к шаблону класса, а не к классу.

В таких случаях я продолжаю говорить о Widget как о классе несмотря на то, что в действительности это шаблон. Столь неформальное отношение к различиям между классами и шаблонами классов, структурами и шаблонами структур, функциями и шаблонами функций безвредно (при условии, что оно не приводит к возникновению неоднозначности в рассматриваемой теме).

Рекомендации

Рекомендации, составляющие 50 советов этой книги, основаны на мнениях и наблюдениях опытнейших программистов STL. Они в краткой форме подводят итог всему, что практически всегда следует (или наоборот, не следует) делать для успешного использования библиотеки STL.

С другой стороны, это всего лишь рекомендации, и в некоторых ситуациях их нарушения вполне оправданны. Например, в заголовке совета 7 говорится о необходимости вызова delete для указателей перед уничтожением контейнера. Но из текста совета становится ясно, что это правило действует лишь в тех случаях, когда объекты, на которые ссылаются указатели, должны уничтожаться раньше самого контейнера.

Другие сокращения:  Гайд: Genshin Impact — Сян Лин. Лучшие билды, оружие, артефакты — Игромания

Обычно это действительно так, но не всегда. Приведу другой пример — в заголовке совета 35 предлагается использовать алгоритмы STL для выполнения простых сравнений строк без учета регистра, но из текста совета следует, что в некоторых случаях лучше использовать функцию не только внешнюю по отношению к STL, но даже не входящую в стандарт C !

Только хорошее знание специфики программы и условий ее работы позволит определить, стоит ли нарушать представленные рекомендации. Обычно этого лучше не делать, но в отдельных случаях возможны исключения. Как рабская покорность, так и безрассудное легкомыслие одинаково вредны. Прежде чем сходить с проторенной дороги, убедитесь в том, что для этого есть достаточно веские причины.

[ Назад ][ Содержание ][ Вперед ]

Создание файла stl

После того, как вы спроектируете свою модель в программе CAD, у вас есть возможность сохранить файл в формате STL. В зависимости от программы и выполняемой работы, вам может потребоваться нажать «Сохранить как», чтобы увидеть параметр файла STL. Опять же, формат файла STL – это рендеринг или создание поверхности вашего объекта в виде сетки треугольников.

Когда вы выполняете 3D-сканирование объекта с помощью лазерного сканера или какого-либо цифрового устройства обработки изображений, вы обычно получаете не сетчатую, а цельную модель, как если бы вы создали нарисованный с нуля 3D-чертеж САПР.

Программы САПР делают большую часть этого довольно простым делом, выполняя работу за вас, однако, некоторые программы трехмерного моделирования дадут вам больший контроль над количеством и размером, например, треугольников, что может дать вам более плотную или сложную поверхность сетки, и, следовательно, лучшую 3D-печать.

Не вдаваясь в специфику различных 3D-программ, вы можете изменить несколько факторов, чтобы создать лучший файл STL:

  • Хордовый допуск/Отклонение. Это расстояние между поверхностью исходного чертежа и треугольниками мозаичного (сетчатого) проекта STL.
  • Контроль угла. Вы можете управлять промежутками (зазорами) между треугольниками и изменять углы (отклонения) между соседними треугольниками, чтобы улучшить разрешение печати – в частности, это означает, что у вас будет лучший сварной шов между двух поверхностей треугольника. Этот параметр позволяет увеличить степень наложения или мозаичности близких объектов (стандартная тесселяция).
  • Бинарный или ASCII. Двоичные файлы меньше по размеру и ими легче делиться с помощью электронной почты или загрузки/выгрузки. Преимущество файлов ASCII заключается в том, что они легче читаются и проверяются.

Ссылки

Ссылки на книги Джосаттиса и Остерна в предыдущем абзаце дают представление о том, как в этой книге оформляются библиографические ссылки. Как правило, я стараюсь включить в ссылку достаточно информации, чтобы ее узнали люди, уже знакомые с этим трудом.

Три публикации упоминаются так часто, что номер ссылки обычно не указывается. Первая из них, Международный стандарт C [5], в книге именуется просто «Стандартом». Две другие — мои предыдущие книги о C , «Effective C » [1] и «More Effective C » [2].

Строки

Любая серьезная библиотека имеет свои классы для представления строк. В STL строки представляются как в формате ASCII, так и Unicode:string — коллекция однобайтных символов в формате ASCII;wstring — коллекция двухбайтных символов в формате Unicode; включается командой #include <xstring>.

Строковые потоки

strstream — используются для организации STL-строкового сохранения простых типов данных.Разбор примеров начнем именно с этого класса.

//stl.cpp: Defines the entry point for the console application&nbsp;
#include "stdafx.h"
#include <iostream>
#include <strstream>
#include <string>
using namespace std;
int _tmain (int argc, _TCHAR* argv [])
{ strstream xstr; for (int i = 0; i < 10; i ) { xstr << "Demo " << i << endl; } cout << xstr.str (); string str; str.assign (xstr.str (), xstr.pcount ()); cout << str.c_str (); return 0;
}

Строковый поток — это буфер с нуль-терминатором в конце, поэтому при первой распечатке в конце строки оказывается мусор, т.е. получить реальный конец можно не посредством нуль-терминатора, а получив счетчик: pcount(). Затем «реальная часть» потока копируется в новую строку, и мы получаем распечатку уже без мусора.

Терминология

Данная книга не является учебником начального уровня по STL. Предполагается, что читатель уже владеет основными материалом. Тем не менее следующие термины настолько важны, что я счел необходимым особо выделить их.

• Контейнеры vector, string, deque и list относятся к категории стандартных последовательных контейнеров. К категории стандартных ассоциативных контейнеров относятся контейнеры set, multiset, map и multimap.

• Итераторы делятся на пять категорий в соответствии с поддерживаемыми операциями. Итераторы ввода обеспечивают доступ только для чтения и позволяют прочитать каждую позицию только один раз. Итераторы вывода обеспечивают доступ только для записи и позволяют записать данные в каждую позицию только один раз.

Итераторы ввода и вывода построены по образцу операций чтения-записи в потоках ввода-вывода (например, в файлах), поэтому неудивительно, что самыми распространенными представителями итераторов ввода и вывода являются istream_iterator и ostream_iterator соответственно.

Прямые итераторы обладают свойствами итераторов ввода и вывода, но они позволяют многократно производить чтение или запись в любой позиции. Оператор — ими не поддерживается, поэтому они позволяют производить передвижение только в прямом направлении с некоторой степенью эффективности.

Все стандартные контейнеры STL поддерживают итераторы, превосходящие эту категорию итераторов по своим возможностям, но, как будет показано в совете 25, одна из архитектур хэшированных контейнеров основана на использовании прямых итераторов. Контейнеры односвязных списков (см. совет 50) также поддерживают прямые итераторы.

Двусторонние итераторы похожи на прямые итераторы, однако они позволяют перемещаться не только в прямом, но и в обратном направлении. Они поддерживаются всеми стандартными ассоциативными контейнерами, а также контейнером list.

Итераторы произвольного доступа обладают всеми возможностями двусторонних итераторов, но они также позволяют переходить в прямом или обратном направлении на произвольное расстояние за один шаг. Итераторы произвольного доступа поддерживаются контейнерами vector, string и deque. В массивах функциональность итераторов произвольного доступа обеспечивается указателями.

• Любой класс, перегружающий оператор вызова функции (то есть operator()), является классом функтора. Объекты, созданные на основе таких классов, называются объектами функций, или функторами. Как правило, в STL объекты функций могут свободно заменяться «обычными» функциями, поэтому под термином «объекты функций» часто объединяются как функции C , так и функторы.

• Функции bind1st и bind2nd называются функциями привязки (binders).

Революционным новшеством STL являются гарантии сложности, то есть ограничения объема работы, выполняемой любыми операциями STL. Таким образом, программист может сравнить относительную эффективность нескольких решений в зависимости от платформы STL. Гарантии сложности выражаются в виде функции от количества элементов в контейнере или интервале (п).

• Операция с постоянной сложностью выполняется за время, не зависящее от п. Например, вставка элемента в список выполняется с постоянной сложностью. Сколько бы элементов ни содержал список, один или миллион, вставка будет занимать практически одинаковое время.

Термин «постоянная сложность» не стоит воспринимать буквально. Он означает не то, что время выполнения операции остается строго постоянной величиной, а лишь то, что оно не зависит от п. Например, на двух разных платформах STL время выполнения операции «с постоянной сложностью» может заметно отличаться.

• Операции с логарифмической сложностью с ростом n выполняются за время, пропорциональное логарифму п. Например, операция с миллионом элементов будет выполняться только в три раза дольше операции с сотней элементов, поскольку log n^3 = 3 log n. Многие операции поиска в ассоциативных контейнерах (например, set::find) обладают логарифмической сложностью.

• Время, необходимое для выполнения операций с линейной сложностью, возрастает пропорционально п. Стандартный алгоритм count работает с линейной сложностью, поскольку он должен просмотреть каждый элемент в заданном интервале.

Как правило, операции с постоянной сложностью выполняются быстрее, чем операции с логарифмической сложностью, а последние выполняются быстрее операций с линейной сложностью. Этот принцип особенно четко выполняется для больших значений п, но при относительно малых n операции, которые теоретически должны занимать больше времени, в отдельных случаях выполняются быстрее. За дополнительной информацией о гарантиях сложности в STL обращайтесь к книге Джосаттиса «The C Standard Library» [3].

И последнее замечание по поводу терминологии: вспомните, что каждый элемент контейнеров map и multimap состоит из двух компонентов. Я обычно называю первый компонент ключом, а второй — ассоциированным значением. Например, в контейнере

map<string,double> m;

ключ относится к типу string, а ассоциированное значение — к типу double.

Заключение

STL — кросс-платформенная библиотека. Конечно, не существует абсолютной гарантии, что эта библиотека есть в любой версии компилятора. Например, она редко реализуется на мобильных устройствах, потому что большая часть реализованных структур данных делает выбор в пользу быстродействия, совершенно не экономя память, а ведь именно память является самым ценным ресурсом на мобильных платформах, в то время как на PC ее сейчас в избытке.

Оцените статью
Расшифруй.Ру