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

时间:2013-04-12 00:54:20

标签: c++ iterator dereference

我正在阅读C ++ Primer 5th,我遇到的代码如下:

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

it从迭代器接收到字符串s中第一个字符的值;然后由toupper()将其更改为大写。 it如何解除引用?它不应该只是一个char类型变量而不是指针吗?

3 个答案:

答案 0 :(得分:2)

ititerator

  

在C ++中,迭代器是指向一个元素的任何对象   元素范围(例如数组或容器)具有这种能力   使用一组运算符迭代该范围的元素   (至少,增量(++)和解除引用(*)运算符)。

     

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

     

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

由于迭代器是一个行为类似于指针的智能对象(最初指向字符串的开头 - 这是一个container),并迭代该容器,{{ 1}}可以解除引用,如代码示例中所示。因此,通常it 可用作指针。

在你的情况下,字符串中指针的当前位置被分配给该位置 的大写等值

it

答案 1 :(得分:0)

迭代器类型(这是通过使用神奇的auto关键字隐藏的东西)是一件复杂的事情,而不是原始对象。

当您要求*it时,您会在该位置获得对char 的引用。因此你可以修改它。

答案 2 :(得分:0)

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

“it”是一个迭代器(像对象一样的指针),而不是一个指针。 选择迭代器而不是指针有一定的好处。一个显着的好处是将算法与容器分开。因此具有通用算法(仅受迭代器类型的约束),从而将容器与算法分离。

请看看 STL iterators - purpose