2012-09-28 59 views
1
vector<int> v(1, 1); 
it = v.begin(); 

爲什麼*it++沒有在第一個元素上加上一個?C++中的迭代器

雖然我可以用*it = *it + 1

我還沒有使用C++多年

+2

http://en.cppreference.com/w/cpp/language/operator_precedence – chris

回答

0

因爲*it++意味着後置it和間接引用的結果(it原始值),因爲++結合更緊密(這相當於到*(it++))。它不修改*it的內容。如果您想增加*it,請使用(*it)++

+2

不,它沒有。它意味着'it ++',並對結果進行解引用。後增加的結果是迭代器在增加之前的值。迭代器後遞增可能效率低下。 –

+0

好的,這是更好的 –

+0

他的意思是後增量首先被激發,並且返回的結果是deref是* prior *元素。因此昂貴的部分。 – WhozCraig

4

++的優先級高於*。

所以第一個迭代器指向下一個元素,然後用*去除引用,你可以在左邊收集v [1]。

使用下面的代碼來解決問題。

#include<iostream> 

using namespace std; 

int main() 
{ 
vector<int> v(2, 1); 
vector<int>::iterator it; 
it = v.begin(); 
(*it)++; //instead of *it++; 

cout << v[0] << v[1] << endl; 
} 
+0

我無法獲得此代碼進行編譯。我錯過了什麼?以下是ideone.com上的代碼 - http://shar.es/5gmnM – lifebalance

0

正如其他人解釋

int x = *it++; 

相當於

int x = (*it)++; 

這相當於

int x = *it; 
it = ++it; // prefix 

不遞增,直到後分號(因爲它是後綴運算符)。 的posfix ++運營商通常使用前綴操作符這樣

template<typename T> vector<T>::iterator vector<typename T>::iterator::operator++(int) 
{ 
    vector<T>::iterator tmp(*this); 
    ++(*this); // call prefix operator++() 
    return tmp; 
} 

實現,其中你可以看到,它的操作符之前返回迭代器的值++()完成。