Означает ли "вектор <x>:: iterator", что существует пространство имен "вектор <x>"? - PullRequest
1 голос
/ 25 сентября 2011

Я видел код

vector<char> v(10);
vector<char>::iterator p;

здесь зачем нужен vector<char>::. Значит ли это, что итератор является классом внутри векторного пространства имен?

Ответы [ 5 ]

4 голосов
/ 25 сентября 2011

Означает ли это, что итератор является классом внутри векторного пространства имен?

Не совсем, это тип внутри vector класс шаблон. Итератор зависит не только от типа контейнера (здесь vector), но и от типа итерируемого элемента (здесь char).

2 голосов
/ 25 сентября 2011

Возможно, самый простой способ - это понять, что :: является оператором области, а не только для пространств имен.

std::vector<char> является классом, и поэтому у него есть своя собственная область действия класса (3.3.6 вC ++ 03, 3.3.7 в C ++ 11).std::vector<char>::iterator - это полное имя в этой области.В случае iterator он называет тип - не обязательно класс, и даже если это сам класс, он не обязательно определяется в std::vector<char>, поскольку iterator может быть typedef.

Как это бывает, область видимости класса не является одной из тех вещей, которые C ++ называет «пространством имен».В повседневном [*] английском вы можете описать его как некое пространство имен, просто это не является правильной терминологией в C ++.

Однако, как бы вы это ни называли, имейте в виду, что это vector<char>класс и имеет область действия, которая содержит iterator, а не vector.std::vector гарантирует, что любой vector<T> имеет тип iterator, но для других шаблонов это не обязательно тот случай, когда каждая специализация имеет одинаковых членов и вложенные типы.Таким образом, vector охват не существует.

[*] "каждый день", если ваши дни - это дни, когда люди, которые много говорят о пространствах имен.

1 голос
/ 25 сентября 2011

Это также означает, что итератор работает с vector<char> вместо, скажем, vector<int>.

1 голос
/ 25 сентября 2011

Да, это значит именно это. Итератор определен в области видимости класса vector, и для каждого отдельного типа создается vector, существует иная реализация итератора.

0 голосов
/ 25 сентября 2011

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

Но вопрос имеет некоторый смысл: синтаксис A :: B обычно не различим.В терминах разрешения имен, если факт, оба класса пространства имен являются ... контейнером имен.

Классы - это больше, чем контейнеры имен: они представляют данные, имеющие экземпляры и связанные функциональные возможности.Пространства имен - это просто контейнер для имен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...