Диапазон итераторов.
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 01.12.04 10:03
Оценка: 58 (5)
Как продолжение обсуждения темы о паре begin(), end() в связи с появлением в boost диапазона итераторов boost::iterator_range.

У меня есть свои попытки реализовать нечто подобное (старую версию можно найти здесь
Автор: sergey_shandar
Дата: 28.08.04
, а новую в CVS на SourceForge). Так вот, посмотрел на boost::iterator_range, вроде все хорошо. Но, есть некоторые вопросы.

1. Прошу обратить внимание на boost::end(), на строчку s + sz — 1 if X is Char[sz]. Для меня это немного странно, т.е. получаеться

    char A[5];
    boost::end(A) == A + 4; /// true???
    boost::size(A) == 4; /// true, правильно понял?
    int B[5];
    boost::end(B) == B + 5; /// true
    boost::size(B) == 5; /// true


По моему, это совершенно неправильно. Массивы трогать нельзя, даже ради строк "...", L"...". Если нужны строки заканчивающиеся нулями, то можно испольвать какие нибудь оболочки, например:

    char A[] = "Hello world!";
    boost::end(make_stringz(A)) == 4;


Интересно ваше мнение.

2. В boost::iterator_range поля m_Begin и m_End сделаны недоступными из вне. Вопрос: а зачем? По моему, было бы очень даже удобно использовать такие поля, например так:

    int A[...];
    ...
    for(boost::iterator_range<int *> R(A); !R.empty(); ++R.m_Bbegin)
    {
        ...
    }



Дополнительно: Свой iterator_range я наследовал от std::pair<Iterator, Iterator> (иногда удобно сразу же использовать такую пару без дополнительных конвертаций), поэтому у меня ++R.first, что вобщем смотрится неплохо.

3. Больше вопрос дизайна. По моему, все свойства контейнеров, такие как typename boost::range_iterator<T>::type, typename boost::range_value<T>::type, boost::begin(x), boost::end(X), сами напрашиваються в какое нибудь отдельное пространство имен, типа boost::container, например так:

    boost::container::iterator<T>::type;
    boost::container::value_type<T>::type;
    ...
    boost::container::begin(x);
    boost::container::end(x);
    ...


К тому же это будет хорошо подходить к той концепции контейнеров, на которую ссылаются сами авторы boost::range.

PS. А началось все с того что захотелось мне выкинуть свой iterator_range, и заменить на бустовский. Но передумал , по крайней мере пока.
getboost.codeplex.com
citylizard.codeplex.com
Re: Диапазон итераторов.
От: MaximE Великобритания  
Дата: 01.12.04 20:01
Оценка: +1
sergey_shandar wrote:

> Как продолжение обсуждения темы о паре begin(), end() в связи с появлением в boost диапазона итераторов boost::iterator_range.

>
> У меня есть свои попытки реализовать нечто подобное (старую версию можно найти здесь
Автор: sergey_shandar
Дата: 28.08.04
, а новую в CVS на SourceForge). Так вот, посмотрел на boost::iterator_range, вроде все хорошо. Но, есть некоторые вопросы.

>
> 1. Прошу обратить внимание на boost::end(), на строчку s + sz — 1 if X is Char[sz]. Для меня это немного странно, т.е. получаеться
>
>
>     char A[5];
>     boost::end(A) == A + 4; /// true???
>     boost::size(A) == 4; /// true, правильно понял?
>     int B[5];
>     boost::end(B) == B + 5; /// true
>     boost::size(B) == 5; /// true
>

>
> По моему, это совершенно неправильно. Массивы трогать нельзя, даже ради строк "...", L"...". Если нужны строки заканчивающиеся нулями, то можно испольвать какие нибудь оболочки, например:
>
>
>     char A[] = "Hello world!";
>     boost::end(make_stringz(A)) == 4;
>

>
> Интересно ваше мнение.

Согласен.

В моем коде на константные строковые литералы я почти всегда ссылаюсь через char const*, а char[] использую только для буферов. Эти буфера практически никогда не заполнены строкой "под завязку", т.е. определение длины строки лишь по размеру буфера не дает правильный результат. Я детально не рассматривал эту либу и доки ее не читал, но мне кажется, что такое решение скорее добавит больше ошибок чем удобства.

> поля m_Begin и m_End сделаны недоступными из вне. Вопрос: а зачем? По моему, было бы очень даже удобно использовать такие поля, например так:


[]

Видимо потому, что iterator_range<> предоставляет обобщенный интерфейс container или его подмножество из §23.1.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 delta
Re: Диапазон итераторов.
От: Аноним  
Дата: 23.12.07 23:44
Оценка:
Здравствуйте, sergey_shandar, Вы писали:

_>Как продолжение обсуждения темы о паре begin(), end() в связи с появлением в boost диапазона итераторов boost::iterator_range.


_>У меня есть свои попытки реализовать нечто подобное (старую версию можно найти здесь
Автор: sergey_shandar
Дата: 28.08.04
, а новую в CVS на SourceForge). Так вот, посмотрел на boost::iterator_range, вроде все хорошо. Но, есть некоторые вопросы.


_>1. Прошу обратить внимание на boost::end(), на строчку s + sz — 1 if X is Char[sz]. Для меня это немного странно, т.е. получаеться


_>
_>    char A[5];
_>    boost::end(A) == A + 4; /// true???
_>    boost::size(A) == 4; /// true, правильно понял?
_>    int B[5];
_>    boost::end(B) == B + 5; /// true
_>    boost::size(B) == 5; /// true
_>


_>По моему, это совершенно неправильно. Массивы трогать нельзя, даже ради строк "...", L"...". Если нужны строки заканчивающиеся нулями, то можно испольвать какие нибудь оболочки, например:


может имелось в виду это:
    char A[] = "12345";
    bool b = false;
    cout << sizeof(A) << endl;    //6, с учетом завершающего лоня
    b = boost::size(A) == 5;    //true

багов в библиотеке не нашел, не нравится только что boost::iterator_range<T> занимает 12 байт, т.к. bool округляется до 4 байт при оптимизации по скорости, — многовато!!!
IteratorT m_Begin;
IteratorT m_End;
bool singular;
singular хранит значение пустой интервал или нет. Какие предложите аргумены в пользу этой переменной?

Оптимизация скорости? Но когда я сортирую vector<boost::iterator_range<const char*> > работа по копированию элементов увеличивается на 50%. В моем случае когда вектор занимает ~100мб, это заметно.
Re[2]: Диапазон итераторов.
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 27.12.07 18:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, sergey_shandar, Вы писали:


_>>Как продолжение обсуждения темы о паре begin(), end() в связи с появлением в boost диапазона итераторов boost::iterator_range.


_>>У меня есть свои попытки реализовать нечто подобное (старую версию можно найти здесь
Автор: sergey_shandar
Дата: 28.08.04
, а новую в CVS на SourceForge). Так вот, посмотрел на boost::iterator_range, вроде все хорошо. Но, есть некоторые вопросы.


_>>1. Прошу обратить внимание на boost::end(), на строчку s + sz — 1 if X is Char[sz]. Для меня это немного странно, т.е. получаеться


_>>
_>>    char A[5];
_>>    boost::end(A) == A + 4; /// true???
_>>    boost::size(A) == 4; /// true, правильно понял?
_>>    int B[5];
_>>    boost::end(B) == B + 5; /// true
_>>    boost::size(B) == 5; /// true
_>>


_>>По моему, это совершенно неправильно. Массивы трогать нельзя, даже ради строк "...", L"...". Если нужны строки заканчивающиеся нулями, то можно испольвать какие нибудь оболочки, например:


А>багов в библиотеке не нашел, не нравится только что boost::iterator_range<T> занимает 12 байт, т.к. bool округляется до 4 байт при оптимизации по скорости, — многовато!!!


По крайней мере, в 1.34.1 точно есть:
http://svn.boost.org/trac/boost/ticket/471

С пометкой wontfix
getboost.codeplex.com
citylizard.codeplex.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.