C ++,如果放在表达式*v.begin+ i / 10++后面,为什么迭代器上的++运算符不起作用?

问题描述

此练习摘自Primer book(C ++):

让我们假设我们拥有一个范围从0到100的等级。我们要计算10个等级中有多少个等级。在0到100之间,可能有101个等级。这些等级可以由11个簇表示:10个簇,每个10个等级,再加上一个簇,满分为100。第一个簇的得分为0到9,第二个簇的得分为10到19,依此类推。最终的簇计算获得了100分的得分。

如果我们的输入是

,则以这种方式汇总成绩

42 65 95 100 39 67 95 76 88 76 83 92 76 93

那么输出应该是

0 0 0 1 1 0 2 3 2 4 1

int main() 
{
    vector<int> v(11,0);
    int i;
    while (cin >> i)
    {
        ++*(v.begin() + i / 10); 
    }
    for (auto& r : v)
    {
        cout << r << '\t';
    }
    cout << endl;
        
    return 0;
}

如果是行

++*(v.begin() + i / 10);

更改为

*(v.begin() + i / 10)++;

程序不读取向量。为什么?

解决方法

在表达式++*(v.begin() + i / 10);中,begin()迭代器首先递增i / 10,然后对所得的迭代器进行解引用,然后递增所引用的int

但是在表达式*(v.begin() + i / 10)++;中,begin()迭代器首先增加i / 10,与上面相同。但是由于Operator Precedence++运算符比*运算符具有更高的优先级,因此生成的迭代器先递增,然后取消引用。所指的int保持不变。