为什么可以取消引用C++迭代器,尽管它不是指针?
Why can a C++ iterator be dereferenced although it isn't a pointer?
我正在阅读c++ Primer 5th,我遇到了这样的代码:
string s("some string");
if (s.begin() != s.end())
{
auto it = s.begin();
*it = toupper(*it);
}
it
从迭代器接收到字符串s
的第一个字符的值;然后由toupper()
改为大写。it
是如何解参的?它不应该只是一个char类型的变量而不是指针吗?
it
是迭代器:
在c++中,迭代器是指向a中的某个元素的对象范围内的元素(如数组或容器),具有这种能力使用一组操作符遍历该范围的元素(至少,自增(++)和解引用(*)操作符)。
迭代器最明显的形式是指针:指针可以指向数组中的元素,并且可以使用自增操作遍历它们操作符(+ +)。但是存在其他形式的迭代器。例如,每个容器类型(如vector)具有特定的迭代器类型以有效的方式遍历其元素。
注意,虽然指针是迭代器的一种形式,但不是所有的迭代器具有与指针相同的功能;为了区分迭代器对特定算法的要求,5存在不同的迭代器类别:
由于迭代器是一个智能对象,其行为类似于指针(最初指向字符串的开头——它是一个容器),并在该容器上迭代,因此可以解引用it
,如代码示例所示。因此,通常it
可以用作指针。
在你的例子中,指针在字符串中的当前位置被赋值为它的大写形式在该位置:
*it = toupper(*it);
迭代器类型(这是使用神奇的auto
关键字模糊的东西)是一个复杂的东西,而不是一个基本对象。
当你请求*it
时,你会得到一个指向该位置的char的引用。因此你可以修改它
Shouldn't it just be a char type variable and not a pointer?
"it"是一个迭代器(类似对象的指针),而不是指针。选择迭代器比选择指针有明显的好处。一个显著的好处是将算法与容器分开。因此拥有泛型算法(仅受迭代器类型的约束),从而将容器与算法解耦。
请看一下STL迭代器——目的。
相关文章:
- C++ 关于指针取消引用的技术问题
- 共享指针取消引用错误
- 为什么我在C++中有一个空指针取消引用
- 对指针取消引用的混淆
- 指针取消引用:无法将“节点**”转换为“节点*”
- 是否有某种功能,指针取消给出了rvalue
- 返回指针取消引用的 c++ 会导致分段错误
- cppcheck null指针取消引用:m_buffer-否则,针对null进行检查是多余的
- Cppcheck可能的空指针取消引用:
- 通过基类指针取消引用
- C++中的安全指针取消引用
- 为什么我的链表"next"指针取消引用错误的内存(XCode,C++)
- 数组访问导致空指针取消引用
- C++控制内存访问和指针取消引用
- C++指针取消引用
- C/C++ 双指针取消引用问题
- 优化器删除指针取消引用行
- C/C++ 指针取消引用的问题
- 在c++中将指针取消引用到引用中
- 指针取消引用