增加解除引用的迭代器

时间:2015-10-26 11:05:31

标签: c++ vector iterator increment dereference

我正在进行c ++初级练习(3.25),我试图增加一个解除引用的迭代器。这是我的想法:

vector <int> arcNotas(10,0);        //hold amount of grades by 10-20-30....90-100
int notas = 0;
auto it = arcNotas.begin();
while (cin >> notas && notas!= 1000) {
    it += notas / 10;                   //move the iterator to the right position
    *it++;                              //increment the quantity of elements in that position
    it = arcNotas.begin();              //reset to the initial position
}

但是当我编译它时,编译器说(在第一个&#34;注释&#34;输入之后)&#34; vector迭代器不可递增&#34;。我专门取消引用it来做这件事......我只是不明白什么是错的。我通过递增it而不是*it来搜索,但我找到的只是问题。

2 个答案:

答案 0 :(得分:1)

&#34;迭代器不可递增&#34;消息是运行时错误。它是你的实现,对迭代器进行边界检查,并检测到:

it += notas / 10;

或以下it++会导致it超出arcNotas.end()

在执行此添加之前,您应该修复代码以检查长度,以及修复增加迭代器而不是首先解除引用的问题。

答案 1 :(得分:0)

您的问题是运营商优先级之一。简而言之,您的第*it++;行是错误的。这相当于编写*(it++),它将在首先评估++运算符之后提供旧值,然后取消引用。

相反,您要做的是首先取消引用it,然后通过编写(*it)++来增加值。这是因为++运算符的优先级高于间接运算符*

我将使用文档化的代码示例进行说明:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> grades(5, 0);
    auto it = grades.begin();

    cout << "Show initial elements before increment..." << endl;
    while(it != grades.end()) {
        cout << *it << endl;

        // operator precedence is important;
        // ++ has higher precedence than * for indirection;
        // therefore the observable side-effects are that:
        (*it)++;    // ...this increments the current element pointed by 'it'
        *it++;      // ...this causes 'it' to point to the next element after the old value has been dereferenced w/o additional side-effect
    }

    cout << endl << "Show incremented elements..." << endl;
    it = grades.begin();
    while(it != grades.end()) {
        // notice that elements have been incremented only once by this point
        // not twice as the operator precedence mistake would lead you to believe
        cout << *it << endl;
        it++;
    }

    return 0;
}

构建此程序的命令(GNU / Linux)及其输出如下:

➜  /tmp  g++ -std=c++11 test.cpp -o test
➜  /tmp  ./test
Show initial elements before increment...
0
0
0
0
0

Show incremented elements...
1
1
1
1
1

请注意,鉴于您目前的误解,这些值只会增加一次,而不会增加两倍,您可能已经预期了。