Это немного сложнее, чем это.Итераторы ссылаются на шаблон проектирования GOF с тем же именем и в C ++ применяются таким образом, что они выглядят как указатели.C ++ позволяет перегрузить операторы, что означает, что пользовательские типы могут вести себя особым образом, когда на них используются определенные операторы.
В C ++ имеется несколько типов итераторов с различными уровнями возможностей.Базовое представление вектора и строки достаточно просты, чтобы итераторы вели себя почти так же, как указатели: вы можете добавлять к ним числа для поиска определенного элемента.Например, myVector.begin() + 5
возвращает итератор для 6-го элемента вектора (6-й, потому что индексы начинаются с нуля, а 0 будет первым).Строковые итераторы также позволяют вам делать это.
Строковые константы-итераторы ведут себя подобно константным указателям на символы.Когда вы видите const char* foo
, это не значит, что вы не можете изменить foo
- это просто означает, что вы не можете изменить то, на что оно указывает.Поэтому, когда вы видите std::string::const_iterator foo
, это не значит, что вы не можете изменить foo
.Это просто означает, что вы не можете изменить то, на что оно ссылается.
const char* foo = "abcd";
foo = "zyxwvu"; // valid: the pointer itself can be changed
*foo = 't'; // invalid: the pointed data can't be changed
*(foo + 2) == 'x'; // true
std::string myString = "zyxwvu";
std::string::const_iterator foo = myString.begin();
foo = myString.begin() + 2; // valid: the iterator itself can be changed
*foo = 't'; // invalid: the pointed data can't be changed
*(foo + 2) == 'x'; // true
Если вы не пытаетесь изменить данные, итераторы и const
итераторы ведут себя одинаково.Кроме того, за исключением того, что между ними нет прямого преобразования, указатель на содержимое строки и итератор на содержимое строки ведут себя одинаково.