Название: Обертка контейнеров прямого доступа Отправлено: Igors от Ноябрь 06, 2015, 08:03 Добрый день
Навеяно соседней темой. Работая с одними open-source увидел маленькую штучку, но очень она мне понравилась. Смысл: либе нужны исходные контейнеры/массивы (много). У пользователя эти данные есть, но в каком контейнере - хз. Может вектор, может дека, а может и просто массив. Перегонять из пользовательского контейнера в библиотечный утомительно. Вот класс решающий эту проблему Код: template <typename TYPE> Название: Re: Обертка контейнеров прямого доступа Отправлено: Old от Ноябрь 06, 2015, 08:36 Навеяно соседней темой. Работая с одними open-source увидел маленькую штучку, но очень она мне понравилась. Смысл: либе нужны исходные контейнеры/массивы (много). У пользователя эти данные есть, но в каком контейнере - хз. Может вектор, может дека, а может и просто массив. Перегонять из пользовательского контейнера в библиотечный утомительно. Вот класс решающий эту проблему Эту проблему решают итераторы. :)Название: Re: Обертка контейнеров прямого доступа Отправлено: ssoft от Ноябрь 06, 2015, 09:52 В данном случае Array - это обертка вокруг Raw массива, как раз для того, чтобы для него можно было использовать интерфейс итераторов.
Название: Re: Обертка контейнеров прямого доступа Отправлено: Old от Ноябрь 06, 2015, 10:07 В данном случае Array - это обертка вокруг Raw массива, как раз для того, чтобы для него можно было использовать интерфейс итераторов. Зачем?Код
Название: Re: Обертка контейнеров прямого доступа Отправлено: ssoft от Ноябрь 06, 2015, 10:13 Это, скорее всего, из более раннего периода C++, когда отсутствовал auto в том виде, как он сейчас используется, и std::begin/std::end.
Название: Re: Обертка контейнеров прямого доступа Отправлено: Old от Ноябрь 06, 2015, 10:16 Теперь все ф-ции либы работают с этим классом, ссылаясь на контейнеры юзера. Сам он данные не хранит, поэтому его можно создавать где и когда угодно, и из чего угодно. Удалять/вставлять он конечно не умеет - ну и ладно. Поюзал - очень удобно и просто, без всяких заумностей. Кстати, можно мне рабочий пример использования этого чудо-класса с std::list? Ну или std::deque?Название: Re: Обертка контейнеров прямого доступа Отправлено: Igors от Ноябрь 06, 2015, 10:42 Это, скорее всего, из более раннего периода C++, когда отсутствовал auto в том виде, как он сейчас используется, и std::begin/std::end. Я ни разу не использовал итераторы с этим классом, хватает оператора []. Дело в другом, пример Код Какой тип должен быть у "a"? Придется объявлять эту ф-цию template, а за ней еще и еще, эта зараза мгновенно расползается. А вот с "Array" этого нет. Название: Re: Обертка контейнеров прямого доступа Отправлено: Old от Ноябрь 06, 2015, 10:45 Я ни разу не использовал итераторы с этим классом, хватает оператора []. Хорошо, покажите как вы работали через этот класс с std::list или std::deque с помощью оператора []. Что бы это работало.Название: Re: Обертка контейнеров прямого доступа Отправлено: __Heaven__ от Ноябрь 06, 2015, 12:16 Приехали...
Код
Название: Re: Обертка контейнеров прямого доступа Отправлено: Old от Ноябрь 06, 2015, 12:21 Приехали... Это что? :)Код
Название: Re: Обертка контейнеров прямого доступа Отправлено: __Heaven__ от Ноябрь 06, 2015, 12:23 Это мы вносим изменения в массив констант :)
Название: Re: Обертка контейнеров прямого доступа Отправлено: Old от Ноябрь 06, 2015, 12:48 Это мы вносим изменения в массив констант :) За const_cast нужно отдельно давать по рукам. :)Название: Re: Обертка контейнеров прямого доступа Отправлено: Igors от Ноябрь 06, 2015, 14:03 Это мы вносим изменения в массив констант :) Не спешите стать (якобы) "знатоком" :) Этот класс сделан для ДЕЛА (а не для понтов). Да, он не готовит кофе, не жарит цыплят, и даже плюет на константность (что вообще-то нехорошо). Но он позволяет иметь под рукой "контейнер", что может оказаться куда более важным. Пример:Код: typedef Array<int> TIndexArray; На мой взгляд, отличный пример профессионального подхода. Решается узкий круг задач - но предельно эффективно. А на обвинения "в недостатке общности" и.т.п. - да просто насрать (простите на грубом слове), у профи для этого времени нет :) Название: Re: Обертка контейнеров прямого доступа Отправлено: Old от Ноябрь 06, 2015, 14:14 Не спешите стать (якобы) "знатоком" :) Этот класс сделан для ДЕЛА (а не для понтов). Не надо большими буквами писать слово ДЕЛО. Это не оправдывает того, что этот класс реализован с ошибками, которых можно было избежать.На мой взгляд, отличный пример профессионального подхода. Решается узкий круг задач - но предельно эффективно. А на обвинения "в недостатке общности" и.т.п. - да просто насрать (простите на грубом слове), у профи для этого времени нет :) Вот вот. "Профи" спешат денег с заказчика побыстрей взять и насрать, что там будет завтра. :)Название: Re: Обертка контейнеров прямого доступа Отправлено: __Heaven__ от Ноябрь 06, 2015, 14:16 Профи в чём? ;D
Название: Re: Обертка контейнеров прямого доступа Отправлено: Авварон от Ноябрь 06, 2015, 14:21 std::array_view / std::string_view
Название: Re: Обертка контейнеров прямого доступа Отправлено: Igors от Ноябрь 07, 2015, 14:08 std::array_view Какие-то следы в гугле есть, но в официальных справочниках (cppreference, cplusplus) такого нет. Для интереса попробовал найти "где это в бусте". Побродил минут 10 по sub_array, array_view и assign - но пока ничего не понял. "Ишь ты какой, хотел за 10 минут все понять!". Ну а почему бы и нет если с либой мне хватило и 2? :) Вряд ли программисты далеко не бедной компании не знали о существовании подобного в std/boost, но они предпочли откровенный велосипед - и в этом есть немалые резоны. Название: Re: Обертка контейнеров прямого доступа Отправлено: m_ax от Ноябрь 07, 2015, 14:21 Цитировать Вряд ли программисты далеко не бедной компании не знали о существовании подобного в std/boost, но они предпочли откровенный велосипед Да-да, никрософт тож далекооо не бедная компания.. Теперь всё стало понятно)Название: Re: Обертка контейнеров прямого доступа Отправлено: Авварон от Ноябрь 07, 2015, 16:40 std::array_view / std::string_view А хотя нет, глупость написал. array_view очень ограниченное применение имеет (вектор да массив). дек/кулист уже нельзя, так что это не то. Тут тогда скорее range (пара итераторов) нужен. Название: Re: Обертка контейнеров прямого доступа Отправлено: Old от Ноябрь 07, 2015, 16:53 А хотя нет, глупость написал. array_view очень ограниченное применение имеет (вектор да массив). дек/кулист уже нельзя, так что это не то. А решение выложенное Igors тоже умеет только вектор (который и так весь этот функционал имеет из коробки) да массив.Заявленные в первом посте свойства не соответствуют действительности. :) Название: Re: Обертка контейнеров прямого доступа Отправлено: Igors от Ноябрь 08, 2015, 05:03 Тут тогда скорее range (пара итераторов) нужен. Ну это уж точно должно быть в бусте! Открываем... пытаемся понять "концепт". Ну вроде слово "range" говорит само за себя, но как юзать - хз. Ладно, надо по примерам, гуглим "boost range example".. ага, эту ссылку мнооогие искали... ННу! Вот оно!Код: // Boost.Range library Название: Re: Обертка контейнеров прямого доступа Отправлено: Old от Ноябрь 08, 2015, 08:06 range это буквально пара итераторов:
first - начало последовательности second - конец Код
Название: Re: Обертка контейнеров прямого доступа Отправлено: Авварон от Ноябрь 08, 2015, 23:01 Ну это уж точно должно быть в бусте! Открываем... пытаемся понять "концепт". Ну вроде слово "range" говорит само за себя, но как юзать - хз. Ладно, надо по примерам, гуглим "boost range example".. ага, эту ссылку мнооогие искали... ННу! Вот оно! хз насчет дуста, range library это один из пропозалов к каким-то будущим с++ (17?). Название: Re: Обертка контейнеров прямого доступа Отправлено: Igors от Ноябрь 09, 2015, 08:01 Смысл в том что ф-ции/методы могут работать однообразно как со всем контейнером, так и с его частью. Иначе пришлось бы передавать индексы и/или пресловутые итераторы как аргументы, что довольно коряво.
Еще заметим что в Qt есть подобный класс QStringRef для эффективной работы со строками. И тоже никто не терзался "отсутствием общности" - заточен только на QString Название: Re: Обертка контейнеров прямого доступа Отправлено: Old от Ноябрь 09, 2015, 08:22 Смысл в том что ф-ции/методы могут работать однообразно как со всем контейнером, так и с его частью. Иначе пришлось бы передавать индексы и/или пресловутые итераторы как аргументы, что довольно коряво. Коряво использовать этот класс.Он мало того, что опасен из-за неправильной работы с константными массивами, так и не позволяет работать ни с какими контейнерами, кроме непрерывного куска памяти. А пара итераторов прекрасно справляются с любыми контейнерами. Именно для обеспечения однообразия при работе с любыми контейнерами их и придумали. Название: Re: Обертка контейнеров прямого доступа Отправлено: Авварон от Ноябрь 09, 2015, 17:23 Еще заметим что в Qt есть подобный класс QStringRef для эффективной работы со строками. И тоже никто не терзался "отсутствием общности" - заточен только на QString От него как раз хотят избавиться:) |