2015-02-11 6 views
0

Как я понимаю, std :: vector выделяет/де-распределяет всю память, которую он требует каждый раз, когда его элементы растут или сжимаются, поэтому арифметика указателя может использоваться для итерации векторных элементов.std :: list реализация и указатель arithemetic.

std :: list с другой стороны использует двойной связанный список, каждый элемент указывает на следующий и предыдущий элементы.

Предполагая (возможно, ошибочно), что std :: list выделяет его память динамически, поэтому память распределяется, если и когда требуется, поэтапно. Как std :: list все еще может предлагать арифметику указателя как средство для итерации его элементов ?.

+2

'std :: list' не предоставляет арифметику указателя для итерации. – juanchopanza

+1

Можете ли вы привести пример того, что вы считаете «std :: list»? – SirGuy

+0

begin() возвращает итерацию, поэтому я предполагаю, что могу использовать такие операторы, как iter ++ http://en.cppreference.com/w/cpp/container/list – tuk

ответ

3

Грубо говоря, вы можете принять std::list::iterator как контейнер для указателя на элемент списка struct iterator { list::element *current };. И элемент имеет указатели на следующий и предыдущий, например struct element { list::element *next, *previous }; Когда вы увеличиваете этот итератор, он просто переназначает этот указатель, указывая на следующий элемент. Как it->current = it->current->next в связанных списках. Ничего не найдено.

+0

@tuk Это не указатель. В чем смысл этого? – juanchopanza

+0

Я попытался реализовать свою собственную версию std :: list, чтобы делать то, что вы описали, однако, когда я пытаюсь увеличить итератор, используя: iter ++, он игнорирует мою специальную функцию оператора списка ++ и вместо этого пытается использовать арифметику указателя .... потому что итератор является указателем. Единственный способ, которым я могу заставить его работать, - это увеличить сам объект списка, чтобы вызвать функцию operator ++. – tuk

+1

Итератор - это указатель _not_. В моем примере итератор - это структура, и вам нужно переопределить 'operator ++' для него, как описано. Оператор переопределяется для _iterator_, а не для элемента списка или списка. – ftynse