- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
//Я думал тоже так сделать, но иногда для параметра нужны дополнительные аргументы. Например есть operator()(float, int preciseness). С запятыми такого не сделаешь. Я это применил в своих массивах. Можно написать так:
Array<int> arr;
arr.Init(), 5, 7, 65, 99, 267; //Инициализирует массива числами, перечисленными через запятую
//Кстати, сделал такое добавление в массив:
arr.Insert(0), 5, 7, 3; //Добавляет числа вначало массива
arr.Insert($), 888, 25, 76; //Добавляет в конец
arr.Insert($/2), 65, 23; //В середину
//Знак доллара сделал для схожести с языком D. Теперь не надо писать arr.length, можно писать $. Вообще, это должно быть медленнее, но компилятор оптимизирует и по тестам получается так же.
//P. S. В govnokod.ru не заносить.
Lure Of Chaos 29.08.2011 14:42 # +12
roman-kashitsyn 29.08.2011 14:47 # +5
Lure Of Chaos 29.08.2011 14:50 # +3
TarasB 29.08.2011 15:05 # +2
Кстати, как он это сделал? Через препроцессор вроде не выйдет.
absolut 29.08.2011 15:09 # 0
roman-kashitsyn 29.08.2011 15:10 # +5
xD
CPPGovno 29.08.2011 15:12 # 0
А дальше уж хD
roman-kashitsyn 29.08.2011 15:15 # +5
TarasB 29.08.2011 15:15 # +1
> #define $ CurrentArray.length
Так это он что, перед каждой работой с массивом меняет этот глобальный указатель? Удобно, безопасно.
CPPGovno 29.08.2011 15:22 # 0
Клеветник.
>Удобно, безопасно.
Интересно, а можно сделать без этой дыры в безопасности? Ждём автора, пока отпишется.
TarasB 29.08.2011 15:39 # +1
Arr.Insert().($/2)
Чтобы метод Insert() менял глобальный указатель и указатель на функцию, делающую вставку в массив, а перегруженный оператор () уже вызывал это функцию по указателю для массива из глобального указателя.
В однопоточной программе работать будет. Только медленно и херово.
Для многопоточной не знаю, что придумать.
TarasB 29.08.2011 15:14 # +1
Govnoeb 29.08.2011 22:47 # 0
gammaker 29.08.2011 15:42 # 0
Ну ладно уже. Расскажу, как сделал.
Есть класс ContainerPosition, имеющий 2 переменных. Одна означает абсолютное смещение в массиве, вторая относительное. Здесь UINT_MAX - это конец массива, 0 -начало. Это по сути число с фиксированной точкой от 0 до 1. для класса определена операция деления, которая покомпонентно делит оба данных-члена на число. Статическая функция ContainerPosition::End() возвращает экземпляр класса с относительной позицией UINT_MAX и абсолютной 0. А $ определён так:
#define $ ContainerPosition::End()
Класс имеет функцию, позволяющую получить настоящую позицию в массиве. Функция Array::Insert принимает первым аргументом экземпляр ContainerPosition.
Всё, самое сложное описал, а как сделано преобразование int в ContainerPosition и сложение, думаю сами догадаетесь.
TarasB 29.08.2011 15:49 # 0
А ты на этом преобразовании скорость терять не будешь?
> Статическая функция ContainerPosition::End() возвращает экземпляр класса с относительной позицией UINT_MAX и абсолютной 0. А $ определён так:
#define $ ContainerPosition::End()
Нафига статические функции лепить, почему не написать просто
macGovno 29.08.2011 15:50 # +4
TarasB 29.08.2011 15:51 # 0
roman-kashitsyn 29.08.2011 16:08 # +2
gammaker 29.08.2011 16:19 # 0
Esper 29.08.2011 16:22 # +1
Почему был выбран именно vector?
roman-kashitsyn 29.08.2011 16:23 # 0
gammaker 29.08.2011 16:26 # 0
roman-kashitsyn 29.08.2011 16:27 # 0
gammaker 29.08.2011 16:39 # 0
Esper 29.08.2011 16:42 # +2
gammaker 29.08.2011 16:46 # 0
roman-kashitsyn 29.08.2011 16:51 # +3
gammaker 29.08.2011 17:21 # 0
Но есть один недостаток: если объекты полагаются на то, что их указатель this остаётся неизменным (например, хранит указатель на себя в отдельной переменной и на свои данные-члены), то будут проблемы. Хотя это может быть преимуществом - меньше возможностей наговнокодить.
TarasB 29.08.2011 20:37 # 0
Перемещай объекты не мовом, а специальным конструктором сдвига. В С++ надо будет для всех типов писать этот конструктор, а в С++0х это поддерживается на уровне языка, и для типов, для которых нету конструктора сдвига, вызовется побайтовый сдвиг.
SmackMyBitchUp 29.08.2011 20:53 # +2
TarasB 29.08.2011 21:14 # +5
http://www.gamedev.ru/projects/forum/?id=151691
SmackMyBitchUp 29.08.2011 21:36 # 0
Lure Of Chaos 29.08.2011 21:47 # +1
TarasB 29.08.2011 22:11 # 0
Lure Of Chaos 29.08.2011 22:34 # 0
Xom94ok 29.08.2011 22:41 # 0
roman-kashitsyn 30.08.2011 09:01 # 0
Можно портировать на iPoh и послать в AppleStore.
CPPGovno 30.08.2011 10:04 # 0
TarasB 30.08.2011 10:09 # 0
Но выгляжу на 18, да?
CPPGovno 30.08.2011 10:16 # 0
Lure Of Chaos 30.08.2011 11:19 # 0
CPPGovno 30.08.2011 10:19 # +1
Не нужно считать себя таким старым. Ваш духовный возраст лет на 13-16.
TarasB 30.08.2011 10:22 # +1
gegMOPO4 30.08.2011 21:21 # 0
RaZeR 30.08.2011 11:09 # +1
gegMOPO4 30.08.2011 21:20 # 0
CPPGovno 29.08.2011 21:44 # 0
У вас уже понейронный сдвиг начался.
TarasB 29.08.2011 22:11 # 0
pushkoff 31.08.2011 11:37 # +1
почитай внимательнее что такое move semantic ибо оно имеет крайне малое отношение с понятию move - "двигать" оно больше относится к "перемещать"
TarasB 31.08.2011 16:24 # 0
pushkoff 31.08.2011 16:33 # 0
> вызовется побайтовый сдвиг.
разница между
A(A&&) и A(const A& ) есть только в том случае если A владеет указателями на внешние данные
тогда в move конструкторе их можно просто передать новому классу без копирования.
но допустим для Vector3D(Vector3D&&) и Vector3D(const Vector3D&) разницы не будет.
TarasB 31.08.2011 16:45 # 0
Vecotr3D - это POD, для него нет смысла писать конструктор сдвига.
pushkoff 31.08.2011 16:51 # 0
CPPGovno 31.08.2011 23:00 # +1
Неа. Есть:
В этом случае придется делать лишнюю операцию копирования для возвращаемого значения, не зависимо от того, временный объект передали и его можно "портить" или нет. А тем более когда a+b+c+...+z+..., то бесполезных операций копирования становится слишком много.
При этом, если есть перегрузка конструктора для временных объектов, которые можно без последствий портить:
, то есть возможность не копировать каждый раз возвращаемый объект, а использовать возврат ссылки на уже существующий временный объект RValue, в котором можно без последствий разместить результат работы оператора.
pushkoff 31.08.2011 11:38 # 0
gegMOPO4 30.08.2011 21:15 # 0
Впрочем, 10% разницы при добавлении в конец — это, скорее всего, из-за особенности реализации STL в Visual Studio 2010.
gammaker 31.08.2011 13:58 # 0
gegMOPO4 31.08.2011 16:10 # 0
gammaker 31.08.2011 21:10 # 0
CPPGovno 31.08.2011 21:47 # 0
gammaker 31.08.2011 21:51 # 0
CPPGovno 31.08.2011 22:45 # 0
CPPGovno 31.08.2011 23:03 # 0
roman-kashitsyn 31.08.2011 23:09 # +4
CPPGovno 01.09.2011 06:09 # 0
roman-kashitsyn 01.09.2011 07:56 # +2
CPPGovno 01.09.2011 08:03 # 0
roman-kashitsyn 01.09.2011 08:53 # 0
gammaker 01.09.2011 13:18 # 0
gegMOPO4 31.08.2011 21:56 # 0
pushkoff 31.08.2011 16:37 # 0
обычно STL переписывают для того чтоб получить более простые вещи, ибо STL кишит избыточной универсальностью из-за которой страдает быстродействие.
gammaker 31.08.2011 21:13 # 0
pushkoff 31.08.2011 21:20 # 0
очень часто вседозволенность порождает говнокод
может в случае потребности добавления в начало лучше подумать над каким нибудь более умным решением?
к стати твой вектор не гарантирует что индекс элемента останется тем же, так как при добавлении в начало уже новый элемент будет иметь индекс 0, и если кто-то сохранил индекс по которому он обращался к старому нулевому элементу, то его ждет эпичный фейл при повторном обращении.
gammaker 31.08.2011 21:31 # 0
pushkoff 31.08.2011 21:37 # 0
gegMOPO4 31.08.2011 21:58 # +2
roman-kashitsyn 29.08.2011 16:42 # 0
gammaker 29.08.2011 16:48 # 0
gegMOPO4 30.08.2011 21:19 # 0
CPPGovno 29.08.2011 17:31 # 0
gammaker 29.08.2011 17:39 # 0
Govnoeb 29.08.2011 22:50 # +1
gammaker 30.08.2011 09:24 # 0
gammaker 29.08.2011 16:05 # 0
>Нафига статические функции лепить, почему не написать просто
Потому что класс имеет закрытый конструктор, чтобы пользователь не догадался, что здесь отдельный класс. Пусть пользователь массива считает, что $ - это конец массива, который почему-то нельзя сохранить.
Хотя можно было сделать end статической переменной класса, не помню, почему я так не сделал. По-моему была какая-то причина. Надо перечитать код.
Fai 29.08.2011 16:18 # +6
gammaker 29.08.2011 16:23 # 0
roman-kashitsyn 29.08.2011 16:25 # +6
Fai 29.08.2011 19:09 # 0
CPPGovno 29.08.2011 21:43 # 0
rat4 30.08.2011 08:22 # +5
CPPGovno 30.08.2011 17:00 # 0
gammaker 30.08.2011 09:21 # 0
rat4 29.08.2011 17:47 # +4
Мсье изобрёл std::deque?
Govnoeb 29.08.2011 22:51 # +4
верной дорогой идет товарищ!
CPPGovno 29.08.2011 22:52 # −4
gammaker 30.08.2011 09:18 # 0
CPPGovno 30.08.2011 10:05 # 0
ОЛОЛОНАБАШОРК
gammaker 30.08.2011 10:55 # 0
gammaker 30.08.2011 11:32 # +1
rat4 30.08.2011 11:04 # 0
http://en.wikipedia.org/wiki/Double-ended_queue#Implementations
gammaker 30.08.2011 11:04 # 0
Lure Of Chaos 30.08.2011 11:23 # +3
TarasB 30.08.2011 11:24 # +1
А почему - хз. Может, его достали говнокоды с ГД.ру.
7ion 30.08.2011 13:21 # +1
Хорошо, занесем в личное дело.
guest8 09.04.2019 11:24 # −999