取消引用迭代器

时间:2015-10-16 08:50:32

标签: c++ iterator increment

我想知道是否有人可以在解除引用迭代器时解释增量运算符++和使用...=... + 1之间的区别。我编写了以下一小段代码来对10个箱子中的数字进行排序:

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

using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::cin;

int main()
{
    vector<unsigned> vec(11,0);
    unsigned num;

    while(cin >> num){
        if(num < 100)
            *(vec.begin() + num/10) = *(vec.begin() + num/10) + 1;
        else ;
    }

    for(vector<unsigned>::iterator it = vec.begin();  it != vec.end(); it++)
        cout << *it << endl;
    return 0;
}

当我更改此代码的以下部分时:

*(vec.begin() + num/10) = *(vec.begin() + num/10) + 1;

为:

*(vec.begin() + num/10)++;

代码不再有效。即每个箱中的数字量保持为0.

有人可以解释一下这两行代码之间的区别吗?是由于操作的顺序?也许它首先递增然后取消引用?但如果是这样,我不明白为什么。

btw:我在c ++ 98模式下使用了最新版本的g ++

1 个答案:

答案 0 :(得分:4)

++的优先级高于*,因此您的表达式解析如下:

*((vec.begin() + num/10)++); //increment, then dereference

您需要明确订购:

(*(vec.begin() + num/10))++;

请注意,预增量不需要副本,因此如果您不需要访问以前的值,通常更可取:

++(*(vec.begin() + num/10));

那就说,这条线很吵很不清楚,如果我是你,我会把表达分开:

if(num < 100){
    auto position = vec.begin() + num/10;
    ++(*position);
}

甚至更好(由@dascandy建议):

if (num < 100) {
    ++vec[num/10];
}