为什么可以取消引用C++迭代器,尽管它不是指针?

Why can a C++ iterator be dereferenced although it isn't a pointer?

本文关键字:指针 取消 引用 迭代器 C++ 为什么      更新时间:2023-10-16

我正在阅读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迭代器——目的。