Russian Qt Forum
Ноябрь 23, 2024, 07:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Обертка контейнеров прямого доступа  (Прочитано 14342 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Ноябрь 06, 2015, 08:03 »

Добрый день

Навеяно соседней темой. Работая с одними open-source увидел маленькую штучку, но очень она мне понравилась. Смысл: либе нужны исходные контейнеры/массивы (много). У пользователя эти данные есть, но в каком контейнере - хз. Может вектор, может дека, а может и просто массив. Перегонять из пользовательского контейнера в библиотечный утомительно. Вот класс решающий эту проблему
Код:
template <typename TYPE>
class Array {

public:
    typedef TYPE value_type;
    typedef int  size_type;

    typedef TYPE const& const_reference;
    typedef TYPE const* const_iterator;

    typedef TYPE& reference;
    typedef TYPE* iterator;

public:
    Array() : _begin(0), _size(0) { }
    Array(const Array<value_type>& array) : _begin(array._begin),
                                                  _size(array._size) { }
    Array(const value_type* ptr, size_type size) : _begin(const_cast<value_type*>(ptr)),
                                                      _size(size) { }
    ~Array() { }

    size_type size() const { return _size; }

    const_reference operator[](int index) const { return _begin[index]; }
    const_iterator  begin() const               { return _begin; }
    const_iterator  end() const                 { return _begin + _size; }

    reference operator[](int index) { return _begin[index]; }
    iterator  begin()               { return _begin; }
    iterator  end()                 { return _begin + _size; }

protected:
    value_type* _begin;
    size_type   _size;
};
Теперь все ф-ции либы работают с этим классом, ссылаясь на контейнеры юзера. Сам он данные не хранит, поэтому его можно создавать где и когда угодно, и из чего угодно. Удалять/вставлять он конечно не умеет - ну и ладно. Поюзал - очень удобно и просто, без всяких заумностей.
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Ноябрь 06, 2015, 08:36 »

Навеяно соседней темой. Работая с одними open-source увидел маленькую штучку, но очень она мне понравилась. Смысл: либе нужны исходные контейнеры/массивы (много). У пользователя эти данные есть, но в каком контейнере - хз. Может вектор, может дека, а может и просто массив. Перегонять из пользовательского контейнера в библиотечный утомительно. Вот класс решающий эту проблему
Эту проблему решают итераторы. Улыбающийся
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #2 : Ноябрь 06, 2015, 09:52 »

В данном случае Array - это обертка вокруг Raw массива, как раз для того, чтобы для него можно было использовать интерфейс итераторов.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Ноябрь 06, 2015, 10:07 »

В данном случае Array - это обертка вокруг Raw массива, как раз для того, чтобы для него можно было использовать интерфейс итераторов.
Зачем?

Код
C++ (Qt)
int a[] = { 1, 2, 3, 4, 5 };
 
for( auto it = std::begin( a ); it != std::end( a ); ++it )
cout << *it << endl;
 
return 0;
 
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #4 : Ноябрь 06, 2015, 10:13 »

Это, скорее всего, из более раннего периода C++, когда отсутствовал auto в том виде, как он сейчас используется, и std::begin/std::end.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Ноябрь 06, 2015, 10:16 »

Теперь все ф-ции либы работают с этим классом, ссылаясь на контейнеры юзера. Сам он данные не хранит, поэтому его можно создавать где и когда угодно, и из чего угодно. Удалять/вставлять он конечно не умеет - ну и ладно. Поюзал - очень удобно и просто, без всяких заумностей.
Кстати, можно мне рабочий пример использования этого чудо-класса с std::list? Ну или std::deque?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Ноябрь 06, 2015, 10:42 »

Это, скорее всего, из более раннего периода C++, когда отсутствовал auto в том виде, как он сейчас используется, и std::begin/std::end.
Я ни разу не использовал итераторы с этим классом, хватает оператора []. Дело в другом, пример
Код
C++ (Qt)
void DoSomething( Type & a )
{
  for (auto it = std::begin(a)....
 
Какой тип должен быть у "a"? Придется объявлять эту ф-цию template, а за ней еще и еще, эта зараза мгновенно расползается. А вот с "Array" этого нет.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Ноябрь 06, 2015, 10:45 »

Я ни разу не использовал итераторы с этим классом, хватает оператора [].
Хорошо, покажите как вы работали через этот класс с std::list или std::deque с помощью оператора []. Что бы это работало.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #8 : Ноябрь 06, 2015, 12:16 »

Приехали...
Код
C++ (Qt)
   const int a[] = {1, 2, 3, 4, 5};
   Array<int> wrapper(a, 5);
   wrapper[2] = 7;
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Ноябрь 06, 2015, 12:21 »

Приехали...
Код
C++ (Qt)
   const int a[] = {1, 2, 3, 4, 5};
   Array<int> wrapper(a, 5);
   wrapper[2] = 7;
 
Это что? Улыбающийся

Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #10 : Ноябрь 06, 2015, 12:23 »

Это мы вносим изменения в массив констант Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Ноябрь 06, 2015, 12:48 »

Это мы вносим изменения в массив констант Улыбающийся
За const_cast нужно отдельно давать по рукам. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Ноябрь 06, 2015, 14:03 »

Это мы вносим изменения в массив констант Улыбающийся
Не спешите стать (якобы) "знатоком" Улыбающийся Этот класс сделан для ДЕЛА (а не для понтов). Да, он не готовит кофе, не жарит цыплят, и даже плюет на константность (что вообще-то нехорошо). Но он позволяет иметь под рукой "контейнер", что может оказаться куда более важным. Пример:
Код:
typedef Array<int> TIndexArray;

void CalcIndexHalfs( TIndexArray & arr )
{
   size_t half = arr.size() / 2;
   CalcOne(TIndexArray(&arr[0], half));
   CalcTwo(TIndexArray(&arr[half], arr.size() - half));
}
Да, того же можно достичь с autо (если не ошибаюсь, в С++ 14 он уже понимает "size"). Но так этот size надо таскать с собой (как счетчик для С массива) во всей цепи вызовов, а здесь все самодостаточно.

На мой взгляд, отличный пример профессионального подхода. Решается узкий круг задач - но предельно эффективно. А на обвинения "в недостатке общности" и.т.п. - да просто насрать (простите на грубом слове), у профи для этого времени нет  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Ноябрь 06, 2015, 14:14 »

Не спешите стать (якобы) "знатоком" Улыбающийся Этот класс сделан для ДЕЛА (а не для понтов).
Не надо большими буквами писать слово ДЕЛО. Это не оправдывает того, что этот класс реализован с ошибками, которых можно было избежать.

На мой взгляд, отличный пример профессионального подхода. Решается узкий круг задач - но предельно эффективно. А на обвинения "в недостатке общности" и.т.п. - да просто насрать (простите на грубом слове), у профи для этого времени нет  Улыбающийся
Вот вот. "Профи" спешат денег с заказчика побыстрей взять и насрать, что там будет завтра. Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #14 : Ноябрь 06, 2015, 14:16 »

Профи в чём?  Смеющийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.493 секунд. Запросов: 23.