У меня есть класс с именем A
, и в этом классе у меня есть итерируемый контейнер, который я выполняю с помощью следующих правил доступа - порядок, пустота и другие.Утилита итератора класса C++: определение и использование
Для упрощения следующего примера, давайте рассмотрим, я просто итерацию через контейнер, но это не могут быть сделано с помощью итератора в ВСТРАИВАЕМОЙ контейнеры.
class A {
public:
class iterator {
public:
// Constructor
iterator() {
}
// Destructor
~iterator() {
}
// Advances the iterator
void operator++() {
// Some accessing policy
}
};
private:
std::vector<int> a;
};
Все работает чрезвычайно хорошо - и выглядит очень аккуратно -, за исключением того, что, когда я заявляю о своем итератор, я должен использовать typename
- что я в значительной степени предположить, что используется для того, чтобы сообщить компилятору что у меня есть тип, а не сам класс.
Вопросов:
почему я должен использовать
typename
, когда я делаю:A a; for (typename A::iterator it(...); it != ...; ++it) { }
Как итераторы обычно определяются, так как вектор итератор не требует
typename
тега ? Это связано с объявлением вектора из определения класса, а не из самого вектора?std::vector<int> v; for (std::vector<int>::iterator it(v.begin()); it != v.end(); ++it) { }
ли итераторы, определенные внутри класса контейнера - я предполагаю, что это назвали состав - или, если нет, то как это итераторы добавляются в пространство имен класса, как в:
std::vector<int>::iterator it;
В 1): Почему вы используете 'a :: iterator' вместо' A :: iterator'? – lucasmrod
@lucasmrod Не уверен; Я предполагаю, что это была моя первая попытка, которую я делаю, потому что я точно не знал, что происходит x = – Rubens