малозаметный итератор
В документации указано, что для контейнера map есть итераторы, которые потребляют меньше ресурсов. Скажите, что это за итераторы и при каких условиях их можно использовать?
где такое написано?
где такое написано?
В 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.
В документации указано, что для контейнера map есть итераторы, которые потребляют меньше ресурсов. Скажите, что это за итераторы и при каких условиях их можно использовать?
Обычные итераторы, такие же как и у всех контейнеров.
map<....>::iterator
Использовать их можно там же, где и у других контейнеров - при обходе.
Смотри пример для map::begin() в том же MSDN.
Обычные итераторы, такие же как и у всех контейнеров.
map<....>::iterator
Использовать их можно там же, где и у других контейнеров - при обходе.
Смотри пример для map::begin() в том же MSDN.
в MSDN для map::begin() говорится только об итераторах const_iterator и iterator
в MSDN для map::begin() говорится только об итераторах const_iterator и iterator
Пардон, ошибся. Смотри пример для map::insert :
m2.insert( ++m1.begin( ), --m1.end( ) );
А вообще IMHO просто дается возможность использовать упрощенные итераторы. Например:
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]);
Здесь упрощенным итератором является просто указатель.
От упрощенного итератора, как я понимаю, требуется только три операции: инкремент, разыменование и проверка на неравенство. Т.е. вполне достаточно такого:
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);
Ресурсов же они по-видимому занимают одинаково.
Насколько можно понять, const_iterator отличается от iterator только тем, что при использовании первого нельзя изменить значение.
Ресурсов же они по-видимому занимают одинаково.
Я говорил не о константных итераторах, а об упрощенных.
В принципе самый упрощенный итератор - это просто указатель, а он занимает всего 4 байта (на 32-разрядных платформах).
Я говорил не о константных итераторах, а об упрощенных.
В принципе самый упрощенный итератор - это просто указатель, а он занимает всего 4 байта (на 32-разрядных платформах).
Разве итератор занимает больше? Или это определяется внутренним представлением контейнера?
Разве итератор занимает больше? Или это определяется внутренним представлением контейнера?
Ну да... это я что-то сморозил неподумав. :)
Памяти итераторы, в принципе, должны занимать одинаково.
Ну да... это я что-то сморозил неподумав. :)
Памяти итераторы, в принципе, должны занимать одинаково.
Т.е. 4 байта? Или все-таки больше, в зависимости от того, для какого контейнера этот итератор?
Т.е. 4 байта? Или все-таки больше, в зависимости от того, для какого контейнера этот итератор?
Размер памяти, занимаемая итератором, зависит от его реализации, в т.ч. и для конкретного контейнера.
Например, итератор для vector<bool> будет всегда больше, чем итератор для vector<int>. Это обусловлено оптимизацией контейнера vector для булевских значений, которая прописана в стандарте.