微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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保持不变。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。