取消引用迭代器


#include <iostream>
#include<string>
using std::string;
using namespace std;

int main()
{
string s("some string");


*s.begin() = toupper(*s.begin());


std::cout << s << std::endl;

}

结果是:

一些字符串

为什么必须使用*s.begin((?为什么我不能只使用s.begin((?类似:

s.begin() = toupper(s.begin());

为什么必须在迭代器前面使用取消引用运算符*?

在C++prime FIFTH EDITION p.107一书中,它说我们取消引用迭代器,将该字符传递给toupper,并将大写字母S返回到原始字符串。

但我仍然不明白,为什么我们不能直接使用s.begin((。指针不就是为了节省内存吗?

假设您使用的是一个指针:

string s("some string");
auto ptr = s.data();     // pointer to first character

然后你仍然需要取消引用它,然后才能分配一个字符:

*ptr = 'X';

指针增加了间接级别。指针不是它所指向的东西。你必须取消引用指针才能访问指针对象。在这方面,迭代器是相同的。字符串中的迭代器不是字符,不过您可以通过迭代器访问该字符。

如果您阅读关于std::string的文档,您可以看到begin()的原型,即iterator begin(),它返回一个iterator

toupper()的原型是int toupper ( int c );。返回int并接受int

在这里,您正在尝试将int(从toupper()返回(分配给迭代器(从s.begin()返回(。您将一个迭代器传递给接受inttoupper()

s.begin() = toupper(s.begin()); // iterator = int(iterator)

如果取消引用迭代器,它将返回它所指向的值的引用。(char&(

*s.begin() = toupper(*s.begin()); // int = int(char)

请记住,您使用的是带有迭代器的引用,而不是直接使用指针。

迭代器是一个指针,它有助于在对象中循环。在这种情况下,s.begin((是一个指针,所以为了访问它的值,你必须用"来取消引用它*&";。

最新更新