为什么我需要取消引用迭代器?

Sla*_*lay -1 c++ iterator c++11

为什么我需要取消引用迭代器?例如,在以下程序中

#include <iostream>
#include <string>
#include <vector>

int main()
{
    using namespace std;
    string s("some string");

    for(auto it = s.begin(); it != s.end(); && !isspace(*it); ++it)
        *it = isupper(*it);
    cout<<s;
}
Run Code Online (Sandbox Code Playgroud)

为什么有必要使用isupper(*it);而不仅仅是isupper(it);

Arm*_*yan 10

迭代器是一个通用指针.它指向了一些东西.如果你有一个需要某些东西的函数(在这种情况下是char或int),而不是"指针"本身,你需要取消引用迭代器.

例如,标准advance函数将迭代器作为其参数.因此,您传递迭代器而不取消引用它,如

std::advance(it, n);
Run Code Online (Sandbox Code Playgroud)

但是如果你有一个指向int的迭代器,你想要将该整数增加4,那么你需要

(*it) += 4;
Run Code Online (Sandbox Code Playgroud)

我建议你读一本关于C++的好书.

顺便说一下,整个循环可以被一次调用替换

 std::transform(s.begin(), s.end(), s.begin(), toupper);
Run Code Online (Sandbox Code Playgroud)

  • @Armen`tapepper`是一个重载函数,你的`transform`例子不能保证工作.请参阅http://gcc.gnu.org/onlinedocs/libstdc++/manual/strings.html#strings.string.simple (2认同)