我正在阅读 C++ Primer 5th,遇到如下代码:
string s("some string");
if (s.begin() != s.end())
{
auto it = s.begin();
*it = toupper(*it);
}
it
从迭代器接收到字符串中第一个字符的值s
;然后将其更改为大写toupper()
。它是如何it
被取消引用的?它不应该只是一个 char 类型变量而不是指针吗?
我正在阅读 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++ 中,迭代器是任何对象,它指向一系列元素(例如数组或容器)中的某个元素,能够使用一组运算符(至少,递增 (++) 和取消引用 (*) 运算符)。
迭代器最明显的形式是指针:指针可以指向数组中的元素,并且可以使用增量运算符 (++) 遍历它们。但是存在其他形式的迭代器。例如,每个容器类型(例如向量)都有一个特定的迭代器类型,旨在以有效的方式迭代其元素。
请注意,虽然指针是迭代器的一种形式,但并非所有迭代器都具有与指针相同的功能。为了区分迭代器对特定算法的要求,存在五种不同的迭代器类别:
由于迭代器是一个智能对象,其行为类似于指针(最初指向字符串的开头 - 这是一个容器),并且迭代该容器,it
因此可以取消引用,如您的代码示例中所示。因此,一般it
可以用作指针。
在您的情况下,字符串中指针的当前位置被分配给与该位置相同的大写字母:
*it = toupper(*it);
迭代器类型(这是使用 magicauto
关键字掩盖的东西)是一个复杂的东西,而不是原始对象。
当您要求时*it
,您将获得对该位置的 char 的引用。因此,您可以对其进行修改。
Shouldn't it just be a char type variable and not a pointer?
"it" 是一个迭代器(类似对象的指针)而不是指针。选择迭代器而不是指针有一定的好处。一个显着的好处是将算法与容器分开。因此具有通用算法(仅受迭代器类型的约束),从而将容器与算法分离。
请看一下 STL 迭代器 - 目的。