问题描述
此练习摘自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
保持不变。