为什么 C++ 迭代器可以被解引用而它并不是一个指针?

3

我正在阅读C++ Primer第五版,遇到了如下的代码:

    string s("some string");
    if (s.begin() != s.end())
    {
      auto it = s.begin();   
      *it = toupper(*it);
    }

it 从迭代器接收字符串 s 中第一个字符的值;然后通过 toupper() 将其转换为大写。那么,为什么可以对 it 进行间接引用?它不应该只是一个 char 类型的变量而不是指针吗?


你为什么认为应该是一个char变量?迭代器的行为很像指针,但operator++被重新定义以允许它们在链表和映射中移动,而不仅仅是数组。 - Ben Voigt
迭代器的解引用运算符返回字符的引用,而不是副本。 - Eddy Luten
3个回答

4

it是一个迭代器:

在C++中,迭代器是任何指向一些元素(如数组或容器)的对象,具有使用一组操作符(至少为增量(++)和解引用(*)操作符)遍历该范围元素的能力。

最明显的迭代器形式是一个指针:指针可以指向数组中的元素,并使用增量运算符(++)遍历它们。但是还存在其他形式的迭代器。例如,每种容器类型(如vector)都有一个特定的迭代器类型,旨在以高效的方式遍历其元素。

请注意,虽然指针是迭代器的一种形式,但不是所有迭代器都具有指针的相同功能。为了区分迭代器对于特定算法应具备的要求,存在五个不同的迭代器类别:

由于迭代器是像指针一样行事的智能对象(最初指向字符串开头-这是一个容器),并且遍历该容器,因此可以像您的代码示例中所示那样对其进行解引用。因此,通常情况下,it可以用作指针。

在您的情况下,将指针的当前位置分配为该位置大写字母的等效值

*it = toupper(*it);

1
你的报价很好,但是你添加的句子是错误的。vector<T>::iterator不是指针,它是一个智能对象,大多数情况下表现得像指针。 - Ben Voigt

0
    Shouldn't it just be a char type variable and not a pointer?

"it" 是一个迭代器(类似指针的对象),而不是指针。选择迭代器而不是指针有明显的好处。一个显著的好处是将算法与容器分离。因此可以拥有通用算法(仅受迭代器类型约束),从而将容器与算法解耦。
请参阅 STL 迭代器 - 目的

0

迭代器类型(这是使用神奇的auto关键字所掩盖的)是一件复杂的事情,而不是一个原始对象。

当你请求*it时,你会得到该位置上字符的引用。因此你可以修改它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接