c++ 取消引用迭代器时 x++ 和 x = x + 1 之间的区别

标签 c++ iterator increment

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

#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)++;

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

谁能给我解释一下这两行代码的区别?是因为操作顺序吗?也许它先递增然后取消引用?但如果是这样,我不明白为什么。

顺便说一句:我在 c++98 模式下使用了最新版本的 g++

最佳答案

++* 有更高的优先级,所以你的表达式被解析成这样:

*((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];
}

关于c++ 取消引用迭代器时 x++ 和 x = x + 1 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33166188/

相关文章:

c++ - 简单的 C++ 代码不会运行

c++ - 通过迭代器检查某些内容是否已更改的方法

java - 在java中使用ListIterator作为LinkedList时遇到问题

c++ - 常量数组

c++ - 是否可以创建指针 vector ?

javascript - JQuery 计数器中的文本

方括号之间的 Javascript 递增数字

java - 内循环中整数不递增

c++ - 如果我将右值分配给类的对象,类的指针成员会发生什么情况?

python - 如何根据defaultdict中的key累加值