2012-09-28 2 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++ означает postincrement it и разыменовать результат (исходное значение it), так как ++ связывает крепче (это эквивалентно до *(it++)). Он не изменяет содержимое на *it. Если вы хотите увеличить *it, используйте (*it)++.

+2

Нет, это не так. Это означает 'it ++' и разыгрывает результат. Результатом пошагового приращения является значение, которое итератор перед тем, как увеличить. И пост-приращение на итераторах может быть неэффективным. –

+0

Хорошо, это лучше –

+0

, что он имеет в виду, это срабатывание post increment, а результат, возвращаемый для deref, - это элемент * before *. Таким образом, дорогая часть. – 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; 
} 

, где вы можете увидеть, что она возвращает значение итератора перед оператором ++() выполняется.

Смежные вопросы