Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

малозаметный итератор

284
25 мая 2006 года
michael_is_98
587 / / 25.02.2005
В документации указано, что для контейнера map есть итераторы, которые потребляют меньше ресурсов. Скажите, что это за итераторы и при каких условиях их можно использовать?
395
25 мая 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by michael_is_98
В документации указано, что для контейнера map есть итераторы, которые потребляют меньше ресурсов. Скажите, что это за итераторы и при каких условиях их можно использовать?

где такое написано?

284
25 мая 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by RelB
где такое написано?


В MSDN:
The iterator provided by the map class is a bidirectional iterator, but the class member functions insert and map have versions that take as template parameters a weaker input iterator, whose functionality requirements are more minimal than those guaranteed by the class of bidirectional iterators. The different iterator concepts form a family related by refinements in their functionality. Each iterator concept has its own set of requirements and the algorithms that work with them must limit their assumptions to the requirements provided by that type of iterator.

3
25 мая 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by michael_is_98
В документации указано, что для контейнера map есть итераторы, которые потребляют меньше ресурсов. Скажите, что это за итераторы и при каких условиях их можно использовать?


Обычные итераторы, такие же как и у всех контейнеров.
map<....>::iterator

Использовать их можно там же, где и у других контейнеров - при обходе.

Смотри пример для map::begin() в том же MSDN.

284
26 мая 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by Green
Обычные итераторы, такие же как и у всех контейнеров.
map<....>::iterator

Использовать их можно там же, где и у других контейнеров - при обходе.

Смотри пример для map::begin() в том же MSDN.


в MSDN для map::begin() говорится только об итераторах const_iterator и iterator

3
26 мая 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by michael_is_98
в MSDN для map::begin() говорится только об итераторах const_iterator и iterator


Пардон, ошибся. Смотри пример для map::insert :

 
Код:
// The templatized version inserting a range
   m2.insert( ++m1.begin( ), --m1.end( ) );


А вообще IMHO просто дается возможность использовать упрощенные итераторы. Например:
 
Код:
pair <int,int> a[] = {
        pair <int,int>(1,2),
        pair <int,int>(2,3),
        pair <int,int>(3,4),
        };

    map<int,int> m;
    m.insert(&a[0], &a[3]);

Здесь упрощенным итератором является просто указатель.

От упрощенного итератора, как я понимаю, требуется только три операции: инкремент, разыменование и проверка на неравенство. Т.е. вполне достаточно такого:
Код:
template<typename T>
class SimpleIterator
{
public:
    SimpleIterator(T* ptr) :ptr(ptr)    {}
    T& operator ++()                    { return *ptr++; }
    const T& operator*( ) const         { return *ptr; };
    bool operator !=(SimpleIterator it) { return ptr != it.ptr; }

private:
    T* ptr;
};

Ну и для нашего примера это выглядело бы так:
Код:
// типа какой-то контейнер
    pair <int, int> a[] = {
        pair <int, int>(1,2),
        pair <int, int>(2,3),
        pair <int, int>(3,4),
        };

    // типа итераторы для начала и конца этого контейнера
    SimpleIterator< pair<int,int> > beginIt(&a[0]);
    SimpleIterator< pair<int,int> > endIt(&a[3]);

    map<int,int> m;
    m.insert(beginIt, endIt);
284
29 мая 2006 года
michael_is_98
587 / / 25.02.2005
Насколько можно понять, const_iterator отличается от iterator только тем, что при использовании первого нельзя изменить значение.
Ресурсов же они по-видимому занимают одинаково.
3
29 мая 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by michael_is_98
Насколько можно понять, const_iterator отличается от iterator только тем, что при использовании первого нельзя изменить значение.
Ресурсов же они по-видимому занимают одинаково.


Я говорил не о константных итераторах, а об упрощенных.
В принципе самый упрощенный итератор - это просто указатель, а он занимает всего 4 байта (на 32-разрядных платформах).

284
29 мая 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by Green
Я говорил не о константных итераторах, а об упрощенных.
В принципе самый упрощенный итератор - это просто указатель, а он занимает всего 4 байта (на 32-разрядных платформах).


Разве итератор занимает больше? Или это определяется внутренним представлением контейнера?

3
29 мая 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by michael_is_98
Разве итератор занимает больше? Или это определяется внутренним представлением контейнера?


Ну да... это я что-то сморозил неподумав. :)
Памяти итераторы, в принципе, должны занимать одинаково.

284
29 мая 2006 года
michael_is_98
587 / / 25.02.2005
Цитата:
Originally posted by Green
Ну да... это я что-то сморозил неподумав. :)
Памяти итераторы, в принципе, должны занимать одинаково.


Т.е. 4 байта? Или все-таки больше, в зависимости от того, для какого контейнера этот итератор?

3
30 мая 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by michael_is_98
Т.е. 4 байта? Или все-таки больше, в зависимости от того, для какого контейнера этот итератор?


Размер памяти, занимаемая итератором, зависит от его реализации, в т.ч. и для конкретного контейнера.

Например, итератор для vector<bool> будет всегда больше, чем итератор для vector<int>. Это обусловлено оптимизацией контейнера vector для булевских значений, которая прописана в стандарте.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог