我正在阅读C ++ Primer 5th,我遇到的代码如下:
string s("some string");
if (s.begin() != s.end())
{
auto it = s.begin();
*it = toupper(*it);
}
it
从迭代器接收到字符串s
中第一个字符的值;然后由toupper()
将其更改为大写。 it
如何解除引用?它不应该只是一个char类型变量而不是指针吗?
答案 0 :(得分:2)
it
是iterator:
在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”是一个迭代器(像对象一样的指针),而不是一个指针。 选择迭代器而不是指针有一定的好处。一个显着的好处是将算法与容器分开。因此具有通用算法(仅受迭代器类型的约束),从而将容器与算法分离。