【发布时间】:2022-10-20 01:19:49
【问题描述】:
#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() 。 指针不只是为了节省内存吗?
【问题讨论】:
-
迭代器与指针非常相似,但如果
s.begin()是一个指针,那么你也不能给它分配一个字符,你也必须取消引用它。 -
“指针不就是为了节省内存吗?”不。一点也不。令人惊讶的是,为什么这种误解如此持久。
-
迭代器不能是字符或对它的引用,因为然后递增它会给出例如'B' 而不是 'A',而不是字符串中的下一个字符。当然,可以用户定义分配并转换为
char,但这可能会产生意想不到的副作用,并可能引入歧义(您想要增加什么?)。相反,引入了operator*(),它实现起来很简单,提供了一个清晰、明确的API,解决了所有用户需求,并且在用户端只涉及最少的额外(并且非常直观)的冗长。 -
你可以实现一个迭代器,然后一切都会清楚。如果我没记错的话,它已经在书中实现了。
-
对于第一个字符,您可以使用 s.front() 而不是
*s.begin()。
标签: c++