Russian Qt Forum
Апрель 19, 2024, 04:38
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Кладовая готовых решений
(Модератор:
Пантер
) >
Обертка контейнеров прямого доступа
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Обертка контейнеров прямого доступа (Прочитано 13688 раз)
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3258
Re: Обертка контейнеров прямого доступа
«
Ответ #15 :
Ноябрь 06, 2015, 14:21 »
std::array_view / std::string_view
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Обертка контейнеров прямого доступа
«
Ответ #16 :
Ноябрь 07, 2015, 14:08 »
Цитата: Авварон от Ноябрь 06, 2015, 14:21
std::array_view
Какие-то следы в гугле есть, но в официальных справочниках (cppreference, cplusplus) такого нет.
Для интереса попробовал найти "где это в бусте". Побродил минут 10 по sub_array, array_view и assign - но пока ничего не понял. "Ишь ты какой, хотел за 10 минут все понять!". Ну а почему бы и нет если с либой мне хватило и 2?
Вряд ли программисты далеко не бедной компании не знали о существовании подобного в std/boost, но они предпочли откровенный велосипед - и в этом есть немалые резоны.
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2094
Re: Обертка контейнеров прямого доступа
«
Ответ #17 :
Ноябрь 07, 2015, 14:21 »
Цитировать
Вряд ли программисты далеко не бедной компании не знали о существовании подобного в std/boost, но они предпочли откровенный велосипед
Да-да, никрософт тож далекооо не бедная компания.. Теперь всё стало понятно)
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3258
Re: Обертка контейнеров прямого доступа
«
Ответ #18 :
Ноябрь 07, 2015, 16:40 »
Цитата: Авварон от Ноябрь 06, 2015, 14:21
std::array_view / std::string_view
А хотя нет, глупость написал. array_view очень ограниченное применение имеет (вектор да массив). дек/кулист уже нельзя, так что это не то.
Тут тогда скорее range (пара итераторов) нужен.
Записан
Old
Джедай : наставник для всех
Online
Сообщений: 4349
Re: Обертка контейнеров прямого доступа
«
Ответ #19 :
Ноябрь 07, 2015, 16:53 »
Цитата: Авварон от Ноябрь 07, 2015, 16:40
А хотя нет, глупость написал. array_view очень ограниченное применение имеет (вектор да массив). дек/кулист уже нельзя, так что это не то.
А решение выложенное Igors тоже умеет только вектор (который и так весь этот функционал имеет из коробки) да массив.
Заявленные в первом посте свойства не соответствуют действительности.
«
Последнее редактирование: Ноябрь 07, 2015, 21:33 от Old
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Обертка контейнеров прямого доступа
«
Ответ #20 :
Ноябрь 08, 2015, 05:03 »
Цитата: Авварон от Ноябрь 07, 2015, 16:40
Тут тогда скорее 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
Сообщений: 4349
Re: Обертка контейнеров прямого доступа
«
Ответ #21 :
Ноябрь 08, 2015, 08:06 »
range это буквально пара итераторов:
first - начало последовательности
second - конец
Код
C++ (Qt)
typedef
pair
<
iterator
,
iterator
>
range
;
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3258
Re: Обертка контейнеров прямого доступа
«
Ответ #22 :
Ноябрь 08, 2015, 23:01 »
Цитата: Igors от Ноябрь 08, 2015, 05:03
Ну это уж точно должно быть в бусте! Открываем... пытаемся понять "концепт". Ну вроде слово "range" говорит само за себя, но как юзать - хз. Ладно, надо по примерам, гуглим "boost range example".. ага, эту ссылку мнооогие искали... ННу! Вот оно!
хз насчет дуста, range library это один из пропозалов к каким-то будущим с++ (17?).
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Обертка контейнеров прямого доступа
«
Ответ #23 :
Ноябрь 09, 2015, 08:01 »
Смысл в том что ф-ции/методы могут работать однообразно как со всем контейнером, так и с его частью. Иначе пришлось бы передавать индексы и/или пресловутые итераторы как аргументы, что довольно коряво.
Еще заметим что в Qt есть подобный класс QStringRef для эффективной работы со строками. И тоже никто не терзался "отсутствием общности" - заточен только на QString
Записан
Old
Джедай : наставник для всех
Online
Сообщений: 4349
Re: Обертка контейнеров прямого доступа
«
Ответ #24 :
Ноябрь 09, 2015, 08:22 »
Цитата: Igors от Ноябрь 09, 2015, 08:01
Смысл в том что ф-ции/методы могут работать однообразно как со всем контейнером, так и с его частью. Иначе пришлось бы передавать индексы и/или пресловутые итераторы как аргументы, что довольно коряво.
Коряво использовать этот класс.
Он мало того, что опасен из-за неправильной работы с константными массивами, так и не позволяет работать ни с какими контейнерами, кроме непрерывного куска памяти. А пара итераторов прекрасно справляются с любыми контейнерами. Именно для обеспечения однообразия при работе с любыми контейнерами их и придумали.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3258
Re: Обертка контейнеров прямого доступа
«
Ответ #25 :
Ноябрь 09, 2015, 17:23 »
Цитата: Igors от Ноябрь 09, 2015, 08:01
Еще заметим что в Qt есть подобный класс QStringRef для эффективной работы со строками. И тоже никто не терзался "отсутствием общности" - заточен только на QString
От него как раз хотят избавиться:)
Записан
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...