Класс итератора против итератора C ++ [закрыто]

У меня есть python 2.7 на машине для Windows, а встроенная sqlite3.sqlite_version - 3.6.x. Выполняя следующие шаги, я смог заставить его использовать sqlite 3.7.9.

  1. Загрузите и распакуйте предварительно скомпилированную двоичную DLL ("sqlite-dll-win32-x86-3070900.zip "на http://www.sqlite.org/download.html )
  2. (вероятно, должен закрыть все экземпляры python в этот момент, чтобы быть в безопасности) Перейти к C: \ Python27 \ DLL и смените имя файла "sqlite3.dll" на "sqlite3.dll.old"
  3. Скопируйте файл "sqlite3.dll" в папку C: \ Python27 \ DLLs
  4. Открыть оболочку python и импортировать sqlite3
  5. Проверить, что sqlite3.sqlite_version отображается как «3.7.9»

-1
задан benso8 17 January 2019 в 01:34
поделиться

2 ответа

Нет ничего волшебного в итераторах, которые вы найдете в контейнерах STL (например, vector). Они сами классы; обычно подклассы для этого конкретного контейнера. В вашем примере vector it является экземпляром класса vector<float>::iterator.

Если вы посмотрите в файл STL <vector>, вы обнаружите что-то вроде (без всех шаблонов и тому подобного):

class vector
{
    ....
    class iterator
    {
        ....
    };
};

Каждый контейнер будет иметь свою собственную реализацию, так как итератор нуждается вести себя по-разному для каждого контейнера. Например, вектор хранится в виде непрерывного массива данных, поэтому p++ в вашем итераторе прекрасно работает для увеличения, в то время как связанный список будет иметь что-то вроде p = p->next для выполнения увеличения.

Вероятно, ваш учитель хочет, чтобы вы поместили этот код итератора в ваш класс, и затем код, выполняющий итерацию по вашему вектору, будет выглядеть как пример.

0
ответ дан Phil M 17 January 2019 в 01:34
поделиться

понятия не имеют, для чего [итератор].

Цель итератора - предоставить единый интерфейс для косвенной ссылки на объекты и выполнить итерацию (номенклатура) последовательности таких объектов.

Возможность ссылаться на объект с помощью итератора аналогична тому, как имя переменной ссылается на связанный объект. Но итераторы более гибкие. Время жизни объекта связано с именем его переменной, но не так с итераторами; итератор может быть назначен для ссылки на другой объект, а ранее упомянутый объект остается в живых. Эта способность весьма важна для возможности повторять последовательностей.

В случае контейнера, такого как вектор, цель итератора состоит в том, чтобы косвенно ссылаться на элементы контейнера и выполнять их итерацию.

В чем разница между классом итератора и итератором?

Значение слова «итератор» очень контекстуально. Итератор - это понятие - категория типов. Это набор требований для типов.

Если тип удовлетворяет всем требованиям, которые должен иметь итератор, то этот тип является итератором. Если объект имеет тип, который является итератором, то этот объект является итератором.

Минимальный набор требований, которым должны удовлетворять все типы итераторов, - это возможность косвенного прохождения через него (что позволяет косвенную ссылку на объекты) и увеличения (что позволяет выполнять итерацию последовательностей).

Существует иерархия категорий итераторов. Каждая более высокая категория предъявляет все больше требований, которым должен соответствовать тип, чтобы быть итератором этой категории.

Разве синтаксис итератора не похож на следующий

Да.

для чего весь этот код, который мне дали?

Внимательно рассмотрите, как вы предлагаете использовать итератор, и сравните его с кодом, который вам дали :

*it                        // you indirect through the iterator
T & operator * () {        // you define the indirection operator

++it                       // you increment the iterator
iterator & operator ++ () {// you define the increment operator

it != values.end()         // you compare an iterator to another
bool operator != (const iterator & rhs) const {
                           // you define a comparison operator

Если ваш класс не реализует эти функции, то этот класс не будет итератором.


P.S Технически нет необходимости писать собственный класс итератора для массива (включая динамический массив, управляемый вектором). Это связано с тем, что указатель удовлетворяет всем требованиям итератора произвольного доступа - указатель является итератором, как показано на рисунке vector::iterator. Таким образом, вы можете просто использовать псевдоним типа:

template<class T>
class vector {
public:
    using iterator = T*;
    // rest of vector
}

Тем не менее, пользовательский итератор может быть написан для обеспечения дополнительной функциональности, которую не имеет указатель.

0
ответ дан eerorika 17 January 2019 в 01:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: