2

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

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

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

4

3 回答 3

3

it是一个迭代器

在 C++ 中,迭代器是任何对象,它指向一系列元素(例如数组或容器)中的某个元素,能够使用一组运算符(至少,递增 (++) 和取消引用 (*) 运算符)。

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

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

由于迭代器是一个智能对象,其行为类似于指针(最初指向字符串的开头 - 这是一个容器),并且迭代该容器,it因此可以取消引用,如您的代码示例中所示。因此,一般it 可以用作指针。

在您的情况下,字符串中指针的当前位置被分配给与该位置相同的大写字母

*it = toupper(*it);
于 2013-04-12T00:59:49.757 回答
0

迭代器类型(这是使用 magicauto关键字掩盖的东西)是一个复杂的东西,而不是原始对象。

当您要求时*it,您将获得对该位置的 char 的引用。因此,您可以对其进行修改。

于 2013-04-12T01:00:32.390 回答
0
    Shouldn't it just be a char type variable and not a pointer?

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

请看一下 STL 迭代器 - 目的

于 2013-04-12T01:14:00.840 回答