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

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

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

Сообщений: 3260


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

std::array_view / std::string_view
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

std::array_view
Какие-то следы в гугле есть, но в официальных справочниках (cppreference, cplusplus) такого нет.

Для интереса попробовал найти "где это в бусте". Побродил минут 10 по sub_array, array_view и assign - но пока ничего не понял. "Ишь ты какой, хотел за 10 минут все понять!". Ну а почему бы и нет если с либой мне хватило и 2? Улыбающийся Вряд ли программисты далеко не бедной компании не знали о существовании подобного в std/boost, но они предпочли откровенный велосипед - и в этом есть немалые резоны.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Цитировать
Вряд ли программисты далеко не бедной компании не знали о существовании подобного в std/boost, но они предпочли откровенный велосипед
Да-да, никрософт тож далекооо не бедная компания.. Теперь всё стало понятно)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


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

std::array_view / std::string_view

А хотя нет, глупость написал. array_view очень ограниченное применение имеет (вектор да массив). дек/кулист уже нельзя, так что это не то.
Тут тогда скорее range (пара итераторов) нужен.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

А хотя нет, глупость написал. array_view очень ограниченное применение имеет (вектор да массив). дек/кулист уже нельзя, так что это не то.
А решение выложенное Igors тоже умеет только вектор (который и так весь этот функционал имеет из коробки) да массив.
Заявленные в первом посте свойства не соответствуют действительности. Улыбающийся
« Последнее редактирование: Ноябрь 07, 2015, 21:33 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Тут тогда скорее range (пара итераторов) нужен.
Ну это уж точно должно быть в бусте! Открываем... пытаемся понять "концепт". Ну вроде слово "range" говорит само за себя, но как юзать - хз. Ладно, надо по примерам, гуглим "boost range example".. ага, эту ссылку мнооогие искали... ННу! Вот оно!
Код:
// Boost.Range library
//
//  Copyright Thorsten Ottosen 2003-2004. Use, modification and
//  distribution is subject to the Boost Software License, Version
//  1.0. (See accompanying file LICENSE_1_0.txt or copy at
//  http://www.boost.org/LICENSE_1_0.txt)
//
// For more information, see http://www.boost.org/libs/range/
//

#include <boost/detail/workaround.hpp>

#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
#  pragma warn -8091 // supress warning in Boost.Test
#  pragma warn -8057 // unused argument argc/argv in Boost.Test
#endif

#include <boost/range/functions.hpp>
#include <boost/range/metafunctions.hpp>
#include <boost/range/as_literal.hpp>
#include <boost/test/test_tools.hpp>
#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>

namespace
{
    //
    // example: extrating bounds in a generic algorithm
    //
    template< typename Range, typename T >
    inline typename boost::range_iterator<Range>::type
    find( Range& c, const T& value )
    {
       return std::find( boost::begin( c ), boost::end( c ), value );
    }
   
    template< typename Range, typename T >
    inline typename boost::range_iterator<Range>::type
    find( const Range& c, const T& value )
    {
       return std::find( boost::begin( c ), boost::end( c ), value );
    }
                   
    //
    // replace first value and return its index
    //                               
    template< class Range, class T >
    inline typename boost::range_difference<Range>::type
    my_generic_replace( Range& c, const T& value, const T& replacement )
    {
       typename boost::range_iterator<Range>::type found = find( c, value );
       
       if( found != boost::end( c ) )
           *found = replacement;
       return std::distance( boost::begin( c ), found );
    }                 
}


void check_algorithm()
{
    //
    // usage
    //
    const int N = 5;                     
    std::vector<int> my_vector;
    int values[] = { 1,2,3,4,5,6,7,8,9 };
    my_vector.assign( values, values + 9 );
    typedef std::vector<int>::iterator iterator;
    std::pair<iterator,iterator>       my_view( boost::begin( my_vector ),
                                                boost::begin( my_vector ) + N );
    BOOST_CHECK_EQUAL( my_generic_replace( my_vector, 4, 2 ), 3 );
    BOOST_CHECK_EQUAL( my_generic_replace( my_view, 4, 2 ), N );

}

#include <boost/test/unit_test.hpp>
using boost::unit_test::test_suite;

test_suite* init_unit_test_suite( int argc, char* argv[] )
{
    test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" );

    test->add( BOOST_TEST_CASE( &check_algorithm ) );

    return test;
}
Мда.. и это еще самый короткий пример Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

range это буквально пара итераторов:
first - начало последовательности
second - конец

Код
C++ (Qt)
typedef pair<iterator, iterator> range;
 
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


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

Ну это уж точно должно быть в бусте! Открываем... пытаемся понять "концепт". Ну вроде слово "range" говорит само за себя, но как юзать - хз. Ладно, надо по примерам, гуглим "boost range example".. ага, эту ссылку мнооогие искали... ННу! Вот оно!

хз насчет дуста, range library это один из пропозалов к каким-то будущим с++ (17?).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Смысл в том что ф-ции/методы могут работать однообразно как со всем контейнером, так и с его частью. Иначе пришлось бы передавать индексы и/или пресловутые итераторы как аргументы, что довольно коряво.

Еще заметим что в Qt есть подобный класс QStringRef для эффективной работы со строками. И тоже никто не терзался "отсутствием общности" - заточен только на QString
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

Смысл в том что ф-ции/методы могут работать однообразно как со всем контейнером, так и с его частью. Иначе пришлось бы передавать индексы и/или пресловутые итераторы как аргументы, что довольно коряво.
Коряво использовать этот класс.
Он мало того, что опасен из-за неправильной работы с константными массивами, так и не позволяет работать ни с какими контейнерами, кроме непрерывного куска памяти. А пара итераторов прекрасно справляются с любыми контейнерами. Именно для обеспечения однообразия при работе с любыми контейнерами их и придумали.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


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

Еще заметим что в Qt есть подобный класс QStringRef для эффективной работы со строками. И тоже никто не терзался "отсутствием общности" - заточен только на QString

От него как раз хотят избавиться:)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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