- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
typedef struct {
UInt8 byte0;
UInt8 byte1;
UInt8 byte2;
UInt8 byte3;
UInt8 byte4;
UInt8 byte5;
UInt8 byte6;
UInt8 byte7;
UInt8 byte8;
UInt8 byte9;
UInt8 byte10;
UInt8 byte11;
UInt8 byte12;
UInt8 byte13;
UInt8 byte14;
UInt8 byte15;
} CFUUIDBytes;
3.14159265 12.04.2013 15:02 # +8
wvxvw 12.04.2013 15:09 # −5
defecate-plusplus 12.04.2013 15:20 # +5
wvxvw 12.04.2013 15:23 # 0
wvxvw 12.04.2013 16:46 # −2
signers. In principle, the necessary mechanisms (based on dependent types—see §30.5) are
well understood, but packaging them in a form that balances expressive power, predictability
and tractability of typechecking, and complexity of program annotations remains a significant
challenge. Some recent advances in the area are described by Xi and Pfenning (1998, 1999).
- Benjamin C. Pierce
* Для недоверчивых говнокодеров :)
3.14159265 12.04.2013 17:03 # +1
>либо определяют тип как ValidRange[0...N]
А как еще определить массив?
wvxvw 12.04.2013 17:09 # −3
Some recent advances in the area are described by Xi and Pfenning
3.14159265 12.04.2013 17:24 # +1
wvxvw 12.04.2013 17:17 # −2
3.14159265 12.04.2013 17:25 # +2
> для связного списка чисел
Мы говорим о массивах.
wvxvw 12.04.2013 17:23 # −1
3.14159265 12.04.2013 17:27 # +3
Ну да. Это я понял.
Как вы собираетесь проверить выбор абсолютно произвольного элемента,
индекс которого в переменной, вводимой пользователем.
Причем проверить что введет пользователь НА ЭТАПЕ КОНПЕЛЯЦИИ.
Причем массив может быть динамическим и иметь произвольную длину.
Вы в своем уме?
bot-minurast 13.04.2013 22:08 # 0
defecate-plusplus 12.04.2013 17:28 # +5
все равно это будут проверки
стоило городить это всё - управляемые языки не столько уж оверхеда дают при индексном обращении - да обращение даже к кешу небось займет больше тактов, чем одно лишнее сравнение беззнаковых целых чисел
3.14159265 12.04.2013 17:30 # +8
Ладно, расходимся. Это очередной вброс, дальше последуют абсурдные аргументы, ссылки на непонятных авторитетов и дискуссия сведется к превосходству лиспа над другими языками (js в частности).
bormand 12.04.2013 17:31 # +4
bormand 12.04.2013 17:41 # +2
Причем для x86, скорее всего, компилятор помечает переход как "маловероятный", и оверхед от криво предсказанного перехода будет только при вылете за границы массива. А в этом случае на него уже насрать.
LispGovno 13.04.2013 23:06 # 0
А как в ассемблере х86-х64 отметить переход "маловероятным"?
bormand 14.04.2013 08:52 # 0
LispGovno 14.04.2013 09:35 # 0
govnomonad 14.04.2013 12:04 # +2
http://bit.ly/YEdyCG
wvxvw 12.04.2013 17:57 # 0
Короче, чего я рапсинаюсь. Находите доклад: Xi, Hongwei and Frank Pfenning. Eliminating array bound checking through dependent types. In ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI), Montreal, Canada, pages 249–257, 1998.
Просвещаетесь самостоятельно.
Ответ не только автору поста выше, просто, чтобы не повторять.
3.14159265 12.04.2013 17:59 # +3
Какое "говно"? У кого "но книга - говно" увидели? Слово "говно" - по треду использовали только Вы. Никто не критиковал Книгу.
Вам задали конкретные вопросы. "Как это сделать в рантайме?"
А Вы увиливаете.
wvxvw 12.04.2013 18:21 # −1
Array[0][Integer], Array[1][Integer], ... Array[N][Integer];
Array[0][Float], Array[1][Float], ... Array[N][Float];
и вы в програмном коде обязаны указывать размер массива, когда описываете функцию, которая с ним работает. Конечно, у такого упрощенного варианта есть масса недостатков, т.как создание родовых функций окончится так же печально, как и попытка сравнить два числа в Скале.
Но не все так плохо, и теоретически доказано, что в принципе, возможно построить систему которая на семантическом уровне предотвратит рантайм проверки (т.е. если код скомпилировался, то значит, что он валидный, и в рантайме ничего проверять уже не нужно).
Использовать Си для примера применения такой системы - занятие очень неблагодарное, т.как в Си система типов не просто безалаберная, она небезопасная и нелогичная...
3.14159265 12.04.2013 18:36 # 0
bormand 12.04.2013 18:38 # 0
3.14159265 12.04.2013 18:42 # +1
Тут вопрос возникает - сколько займет времени сборка сложного проекта?
И не дешевле ли ставить везде копеечные проверки и не париться? Если повсюду итак используют тяжеленные виртуальные машины.
А то может оказаться что на джаве проект уже давно работает, а на ASTе только скомпилился.
bormand 12.04.2013 18:45 # 0
> И не дешевле ли ставить везде копеечные проверки и не париться?
Не в том суть. Есть задачи, в которых неправильный ответ или экцепшн в рантайме может повлечь катастрофу. А здесь все-таки гарантия, что если все тайпчекнулось, и наши предположения о системе верны, и если не распидорасит аппаратную часть, то все будет ок.
А компилируется оно скорее всего быстро. Просто скажет, что недостаточно данных для доказательства, вот и все. Я не занимался этими теориями, но насколько позволяет понять мое дилетантское чутье, большинство инвариантов придется описывать самому. И вот на это и уйдет основная часть времени.
3.14159265 12.04.2013 18:50 # +1
defecate-plusplus 12.04.2013 18:52 # +5
TarasB 14.04.2013 13:46 # 0
LispGovno 14.04.2013 14:05 # +1
Что было первее? Курица или Тролль?
bormand 12.04.2013 18:48 # +3
Чуваки все еще компилят прошивку для реактора на ATS'е, а наш, с прошивкой на жабе, уже взорвался, т.к. всегда падал в рантайме если стержни вдвинуты на 25.67%.
3.14159265 12.04.2013 19:01 # +1
FYI: Чернобыль, перед своим закрытием в 2000-ном приносил нищему хохлостану миллиард долларов в год.
Вот сколько стоит задержка.
А его строили, как и многое в совке, в крайней спешке и очень небрежно, но что поразительно большинство из тех заводов работает до сих пор.
Если б их коммунисты сделали за те же деньги меньше реакторов, но дорогих и с абсолютной защитой от дурака. Мы не имели столько работающих АЭС с "опасными" РБМК и производящих немыслимое количество энергии. И экономика встала бы.(ну или стали б больше больше экономить)
В нашей жизни, в нашей стране много чего делается в спешке и через жопу, но именно эти решения имеют наибольшую практичность.
Это парадоксальный, но вполне реальный факт.
defecate-plusplus 12.04.2013 19:05 # +4
человеку дышать тоже опасно - водой, например, дышать получается недолго
3.14159265 12.04.2013 19:10 # +1
Тем более что дорогие ВВЭР имели защитную оболочку.
Извечная проблема короче:
дешево быстро качественно
guest 13.04.2013 20:31 # 0
у рбмк положительная реактивность
eth0 13.04.2013 22:04 # 0
anonimb84a2f6fd141 27.05.2013 18:20 # −1
3.14159265 12.04.2013 19:23 # 0
bormand 12.04.2013 19:29 # +1
Можно только уменьшить вероятность фейла до разумных пределов, и надеяться на лучшее.
3.14159265 12.04.2013 19:41 # 0
bormand 12.04.2013 20:27 # +2
И большинство проблем как раз из-за ошибок операторов, а не из-за багов в прогах или железе ;(
Abbath 12.04.2013 22:38 # 0
3.14159265 12.04.2013 19:31 # 0
wvxvw 12.04.2013 19:15 # 0
Тут как бы делается предположение исходящее из практики Си[-подобных] языков, где тип задается вообще еще даже до появления переменной. Но вот, например, в CaML тип задается тогда, когда он становится известен. Например, если мы создали список, но еще ничего в него не положили, то тип у списка "список непонятно чего", но после того, как мы туда положили число - то это список чисел.
Похожим образом можно было бы работать и с массивами: если есть код до этого как-то определивший длину, или, по крайней мере позволивший предположить, что как минимум Х элементов там уже есть, то ошибки типов нет. Но возникают проблемы с пользовательским вводом, который не известен заранее и т.д.
Но как уже в самом верху говорилось: в то время, как теоретически доказано, что такую систему можно построить, сделать ее практичной в полном объеме представляется пока что нереальным. И вот тому, кто построит - будет бочка варенья и сколько-то там печенья.
bormand 12.04.2013 19:05 # +2
А ведь суть всех этих зависимых типов совсем не в устранении рантайм проверок... Очень многие рантайм проверки устранить нельзя вообще, по определению, т.к. они проверяют данные из внешних источников.
Суть, имхо, в том, чтобы убедиться в необходимости и достаточности этих проверок. В первую очередь в достаточности, т.к. от этого зависит корректность кода. Во вторую очередь в необходимости, т.к. от этого зависит всего лишь эффективность.
bot-minurast 13.04.2013 22:09 # 0
значит компилятору нужно предусмотреть выделение ресурсов на этот элемент.
LispGovno 13.04.2013 23:00 # +1
Фу, любитель скрытых ошибок.
bot-minurast 14.04.2013 22:50 # −1
LispGovno 14.04.2013 23:53 # +3
Запомни милый бот одно:
Нет юнит-тестов - код говно.
bot-minurast 15.04.2013 10:23 # 0
bormand 15.04.2013 15:54 # 0
Идеальный программист в идеальных условиях в идеальном мире... В реале же - забывают, забивают, не успевают, не замечают...
А компилятор и рантайм - они бессильны. Они не искуственный интеллект. Они ничего не понимают в задаче, они не знают, как им поступить в критической ситуации. Они в конце-концов не несут ответственности за последствия, вызванные неправильной работой программы. Поэтому они не имеют никакого права пытаться что-то исправить. Максимум что они могут - просигнализировать об ошибке. В идеале - сразу при компиляции.
bot-minurast 16.04.2013 21:06 # 0
Abbath 15.04.2013 01:49 # +4
bot-minurast 15.04.2013 10:27 # −1
bormand 15.04.2013 05:15 # +3
Верно.
Но если программа не умирает, а втихушку продолжает творить хуйню портя данные, выдавая неправильные результаты, исполняя рандомные вещи - то лучше бы она умерла. И программист написавший ее так - еще большее говно.
bot-minurast 15.04.2013 10:21 # −1
Каждая программа, каждая функция должна быть написана так, чтобы продолжала выполнять своё предназначение, даже если крякнет процессор, и даже если отключится питание.
bormand 15.04.2013 15:20 # +2
> значит компилятору нужно предусмотреть выделение ресурсов на этот элемент.
Вот это между прочим фатальная ошибка. Программист забыл проверить диапазон. Если мы сейчас выделим память, и дадим программе работать дальше - она натворит хуйни. В 99.99% подобных случаев смерть лучше чем хуйня в ответе.
Одно дело те ошибки, которые учтены программистом, и на которые он может придумать адекватную реакцию. Тут я полностью согласен - нужно продолжать работу. Ну или показать какой-то совет юзеру или записать ошибку в лог.
Другое дело - ошибки, которые программист не учел. Вот тот самый вылет за границы массива это почти всегда фейл программиста. И продолжение работы приведет только к новым проблемам. В первую очередь к тому, что программист не увидит ошибку, не узнает о ней, и она будет жить годами, пока кто-то не нарвется на серьезные последствия от нее.
Поверьте, вылет программы или дроп сессии это далеко не самое страшное, что может случиться...
P.S. Задачи, естественно, разные. Но молчаливое продолжение работы в ситуации неучтенной программистом очень редко будет адекватным поступком.
bormand 15.04.2013 15:26 # 0
Вариант 1 - прога вылетела не дав распечатать квитанции. Позвонили программисту, тот почитал логи, нашел ошибку, пофиксил. Все довольны.
Вариант 2 - прога продолжила работу, насчитала хуйни, квитанции распечатали, разнесли по домам. Весь месяц контора выслушивала вопли от жильцов, а программист - от конторы. Куча потраченного времени и нервов.
bormand 15.04.2013 15:34 # +1
Но ведь они в точности следуют вашим заветам "Нет элемента? Так давайте запилим!".
bot-minurast 16.04.2013 21:21 # −1
Какие-то типично ламерские варианты.
Очевидно же, что при возникновении исключения, прога должна попытаться исправить это исключение. Например несовпадение КБК - ищем по базе наиболее вероятное. Если проге нечего ответить - тогда отправляем уведомление текущему пользователю. Глупо продолжать выполнение явно ошибочной последовательности. Но и вылетать синей смертью, без попыток исправления, логгирования и уведомления - как минимум невежливо.
В контексте комментария, последовательность явно не ошибочная.
TarasB 15.04.2013 22:56 # +1
bot-minurast 16.04.2013 21:00 # −1
guest 16.04.2013 21:05 # 0
bot-minurast 16.04.2013 21:24 # 0
3.14159265 16.04.2013 21:21 # +1
Для этого и придуман.
Но в целом, прав, да.
guest 12.04.2013 20:52 # −1
Вот скажем http://okmij.org/ftp/Haskell/types.html#branding, здесь операции над массивом заворачивают в brand, граничные индексы получаем от этого brand, можно получать следующий / предыдущий индекс / брать середину. Из чисел, разумеется, индекс не получить.
wvxvw 12.04.2013 21:11 # −1
Так что уж, по крайней мере, то, что я написал выше - ну уж никак не неожиданность.
wvxvw 12.04.2013 21:44 # −2
bormand 12.04.2013 21:59 # +3
> Например, 2^32
Зачем в программе столько массивов с заранее известной длиной?
> что будет
Автора такой программы увезут к себе люди в белых халатах.
guest 12.04.2013 22:04 # +1
wvxvw 12.04.2013 22:11 # −2
Там автор этого метода предполагает, что компилятор должен будет создать столько уникальных s, сколько разных массивов есть:
вот, тут вот. И дальше он выдвигает уникальность s, как залог работоспособности системы.
[...] The uniqueness of 's'
afforded by the explicit universal quantification prevents mixing up of
different brands.
bormand 12.04.2013 22:19 # +1
guest 12.04.2013 22:20 # 0
Так что с этим проблем вроде нет.
wvxvw 12.04.2013 22:22 # −2
guest 12.04.2013 22:27 # +1
Это уже аппелирование к конкретной реализации, bormand же бьет в основу :)
bormand 12.04.2013 22:31 # +2
wvxvw 12.04.2013 22:20 # −3
:) Никто ж не говорит "одновременно", можно и постепенно, сегодня - миллион, завтра - еще миллион.
bormand 12.04.2013 22:23 # +1
wvxvw 12.04.2013 22:26 # −2
bormand 12.04.2013 22:28 # +1
wvxvw 12.04.2013 22:34 # 0
bormand 12.04.2013 22:43 # 0
Вот этот вот BArray и BIndex'ы можно юзать только совместно. Значения, полученные из разных вызовов brand смешать между собой не получится.
guest 12.04.2013 22:46 # 0
// ну все-таки вызывается первая ф-ия, а "вторая" - это значения по умолчанию, лучше бы просто вернули (Maybe w)
wvxvw 12.04.2013 22:48 # −3
bormand 12.04.2013 22:52 # +1
wvxvw 12.04.2013 23:06 # −3
bormand 12.04.2013 23:12 # +1
Вы в упор не видите разницы между тем, сколько раз вызов функции написан в коде, и сколько раз он будет произведен в рантайме?
Вот сколько раз надпись brand встречается в коде, столько временных типов сгенерит тайпчекер. На то, сколько раз потом этот brand будет вызываться в рантайме всем похер, и в первую очередь на это похер тайпчекеру.
wvxvw 12.04.2013 23:16 # −4
bormand 12.04.2013 23:23 # +1
Ага, 4 гигабайта в исходниках клипсы занимают конструкции в духе a[i]...
Санитары, срочно в палату!
P.S. Пойду я спать, уже 3 часа ночи, а разговор с интересной темы скатился в какой-то маразм про миллиард операторов.
wvxvw 12.04.2013 23:28 # −4
nemyx 08.07.2020 09:41 # 0
roman-kashitsyn 12.04.2013 23:37 # +2
guest 12.04.2013 22:53 # +2
Это к тому, что сие возражение непосредственного отношения к статье не имеет.
wvxvw 12.04.2013 23:01 # −4
* - В принципе, когда мы определяем тип, то, с конструктивистксой точки зрения, его нужно наполнять, и / или это можно представить как если бы мы могли конкретизировать тип до минимальных составляющих. Так, например, во вселенной представленной в нашей программе неявно всегда существует все множество целых чисел (хотя создаем реально мы только небольшой процент от всего множества), бесконечное множество строк и т.д.
guest 12.04.2013 23:27 # 0
В рантайме-то их не будет.
bormand 12.04.2013 21:52 # +4
Хороший, годный подход. Устранение проверок границ массивов путем устранения самих массивов.
3.14159265 12.04.2013 22:02 # +2
Ну правильно,зачем нам проверки, они дорогие.
Давайте лучше разом повысим алгоритмическую сложность.
guest 12.04.2013 22:02 # 0
Почему это? Просто нужно получить каким-то образом BIndex, получили - доступ по индексу O(1). Ну можно расширить какими-нибудь методами вроде линейной комбинации двух индексов. Нужно смотреть конкретный пример, где подобный подход будет препятствием и делать вывод о его принципиальности.
bormand 12.04.2013 22:07 # 0
Ну вот можно, конечно, добавить в trusted kernel функцию, которая по числу и массиву вернет Maybe BIndex. Но здесь ведь и будет таиться та самая проверка, от которой пытались избавиться...
Конкретный пример... да абсолютно любой алгоритм, в котором массив используют как массив, а не как список/бинарное древо.
guest 12.04.2013 22:11 # 0
Нужно показать принциальную необходимость получения имеенно из числа, а не из уже полученных BIndex-ов.
> как массив, а не в духе списка.
bsearch по ссылке явно не в духе списка, насколько в духе массива или дерева - не скажу
bormand 12.04.2013 22:14 # 0
Имхо вся сила и польза массива в его эффективной операции произвольного доступа. Нет произвольного доступа - массив не нужен.
guest 12.04.2013 22:24 # 0
Вопрос насколько широкий класс алгоритмов отсекается, которым нужен доступ по числам, а не ранее вычисленным индексам.
guest 12.04.2013 22:35 # 0
Есть же, та же линейная комбинация, упомянутая выше, допустим Double -> BIndex i
Не говоря уже, что по всем полученным BIndex-ам доступ как положено, а таким (если не ошибаюсь) и zipper похвастаться не может.
bormand 12.04.2013 22:46 # 0
Там будут проверки на попадание флоата в диапазон 0..1 ;)
guest 12.04.2013 22:49 # 0
LispGovno 13.04.2013 23:12 # −1
О, да ты по ATS угорел. Ъ
Typestate и linear types уже изучил?
wvxvw 14.04.2013 08:24 # 0
LispGovno 14.04.2013 09:41 # −2
roman-kashitsyn 14.04.2013 10:01 # +2
wvxvw 14.04.2013 13:40 # 0
Лучшее от всех миров, т.сказать.
ЗЫ. Я даже не заметил элитизма в том, что я выше написал, но у всех свое мнение.
LispGovno 14.04.2013 14:06 # −3
А заметил ли илитизм?
TarasB 12.04.2013 17:45 # +2
читать про ATS
3.14159265 12.04.2013 17:51 # +1
Тут логика нужна а не ATS.
Судя по тому что я прочёл - кодоанализатор, тупо проверяющий что значение не выйдет за пределы, не станет нулём, итд.
Так это и сейчас компилеры с ide умеют - эклипс выдает ворнинги о " potential null pointer access", например.
Если поставишь выше assert (x!=null) или if (instance of ...) return ...;- то оно исчезнет.
bormand 12.04.2013 17:57 # +2
Вот в том и прикол, что прога, в которой забыли поставить if, проверяющий выход индекса за границы "массива", или написали его неправильно, не тайпчекнется в ATS, и до рантайма дело даже не дойдет.
> Так это и сейчас компилеры с ide умеют
Они умеют только простейшие случаи, в которых неправильность очевидна. ATS же отвергает прогу, правильность которой он не может доказать.
3.14159265 12.04.2013 18:03 # +4
Ну собственно так я и думал.
>ATS же отвергает прогу, правильность которой он не может доказать.
То есть большинство практичных случаев не скомпилится.
Бесполезный теоретический язык, на уровне Хацкила или даже выше.
Как любители борщеца и гумно в частности не дотянулись?
roman-kashitsyn 12.04.2013 18:05 # +3
3.14159265 12.04.2013 18:08 # +2
Как я понял в этом ихнем ATS можно отключить проверку сделав код "небезопасным".
Ну итог очевиден: как все бросают unchecked, так там все будут отключать проверки.
bormand 12.04.2013 18:08 # +1
Большинство вменяемых случаев как раз таки скомпилится. Только вот неизвестно сколько уйдет времени на доказательство их корректности компилятору...
А если приводить доказательство в виде "a < 5, не могу объяснить, почему, но это так, мамой клянусь!", то никакой пользы от такой системы не будет.
3.14159265 12.04.2013 18:11 # 0
У нас есть функция substring - туда приходят какие-то аргументы начала и конца строки. Мы их не знаем наверняка.
И что дальше?
bormand 12.04.2013 18:17 # 0
3.14159265 12.04.2013 18:18 # +1
Ок. Понятно.
>N = length(s)
Так а длина строки заранее неизвестна.
А. Я примерно понял как оно работает.
Ну разбор кода - крайне нетривиальная задача. Серъезные проекты будут компилится вечность.
Уж проще проверки вставлять.
bormand 12.04.2013 18:21 # 0
3.14159265 12.04.2013 18:25 # +2
Оно будет анализировать все циклы, которые используют счётчки-указатели в строке, которые в свою очередь обычно танцуют от нуля и аж до динамически определяемой длины строки.
И если каждый из этих счётчиков нигде не переполнится - то программа корректна.
В этом что-то есть.
3.14159265 12.04.2013 18:27 # +2
БыдлоКод с "магическими числами" типа не соберется.
То есть указатель в строке, никак не привязанный динамически, в коде её длине - не пройдет.
bormand 12.04.2013 18:30 # +3
3.14159265 12.04.2013 18:33 # +1
Логично. Говно везде пролезет.
bormand 12.04.2013 18:41 # 0
LispGovno 13.04.2013 23:37 # 0
roman-kashitsyn 14.04.2013 00:09 # +3
Abbath 15.04.2013 01:51 # 0
Yuuri 15.04.2013 13:11 # +1
roman-kashitsyn 15.04.2013 13:35 # +2
"Какой ужас, мы можем случайно выйти за границы массива" - не самая страшная проблема в ПО. Не припомню ни одного ArrayIndexOutOfBounds в написанном мной коде. Вот NPE прилично было.
LispGovno 15.04.2013 13:48 # −1
?
> Основы Теории Чисел и Общая Топология
Просто нравится или как-то применяете на практике? Использую такие штуки для "расширения сознания и мышления". С практикой плоховато.
LispGovno 15.04.2013 13:49 # 0
roman-kashitsyn 15.04.2013 13:53 # 0
3.14159265 15.04.2013 15:09 # 0
Согласен. Теория чисел - классная штука. Кстати говорят что Виноградов забил на первомайскую демонстрацию и в это время (пока никто не отвлекал административными делами, наверное) доказал тернарную гипотезу Гольдбаха.
>Просто нравится или как-то применяете на практике
Гумно, а ты почитай, поинтересуйся, кто знает, может докажешь проблему Римана.
Премию получишь, без хуёв, мамка борща наварит, будешь как король.
roman-kashitsyn 15.04.2013 15:18 # +3
roman-kashitsyn 15.04.2013 20:40 # +1
Напомнило
3.14159265 15.04.2013 20:49 # 0
А ведь существовал миф о её неразрешимости.
roman-kashitsyn 15.04.2013 21:13 # +1
Да, но сделал это не дилетант. Подобного рода проблемы решаются лишь бородатыми Перельманами, требуя много лет ежедневной целенаправленной работы. Даже самородки вроде Галуа врядли могут решить такие проблемы благодаря лишь благодаря своему необычному мышлению.
Abbath 15.04.2013 20:19 # 0
Yuuri 22.04.2013 15:49 # 0
P.S. Можно было, конечно, обойтись хотя бы динамической проверкой, но насколько мне помнится, в стандартном векторе её нет-с. Обёртку свою писать?
roman-kashitsyn 22.04.2013 16:12 # 0
От ошибок в логике и паршивой архитектуры не спасут даже самые умные компиляторы.
LispGovno 15.04.2013 13:45 # 0
krypt 12.04.2013 19:01 # 0
easyplaton 19.04.2013 09:06 # −1