#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()
返回(。您将一个迭代器传递给接受int
的toupper()
。
s.begin() = toupper(s.begin()); // iterator = int(iterator)
如果取消引用迭代器,它将返回它所指向的值的引用。(char&
(
*s.begin() = toupper(*s.begin()); // int = int(char)
请记住,您使用的是带有迭代器的引用,而不是直接使用指针。
迭代器是一个指针,它有助于在对象中循环。在这种情况下,s.begin((是一个指针,所以为了访问它的值,你必须用"来取消引用它*&";。