end() и контейнеры
От: Страж  
Дата: 25.08.08 12:25
Оценка:
Нужно перебрать элементы контейнера пока не дошли до конца или до элемента с определенным значением.

struct X 
{
 int y;
 //...
};
std::vector<X> v;
std::vector<X>::iterator i;
for(i = v.begin(); i != v.end(); i++) 
{
  if(i->y == 0) break;
  //обработка элементата
}


претит if(i->y == 0) break;

можно так?
std::vector<X> v;
for(i = v.begin(); i != v.end() && i->y ; i++) 
{
  //обработка элементата
}

или неизбежны проблемы из-за выхода за границу массива если нет элементов где y == 0?
Re: end() и контейнеры
От: php-coder Чехия http://slava-semushin.blogspot.com
Дата: 25.08.08 12:29
Оценка: 2 (2)
Здравствуйте, Страж, Вы писали:

С>можно так?


Можно!

С>
С>std::vector<X> v;
С>for(i = v.begin(); i != v.end() && i->y ; i++) 
С>{
С>  //обработка элементата
С>}
С>

С>или неизбежны проблемы из-за выхода за границу массива если нет элементов где y == 0?

В данном случае нет, т.к. логическое И не позволит выполниться второму операнду, если первый будет ложным.
Re: end() и контейнеры
От: vayerx  
Дата: 25.08.08 12:35
Оценка: -6
Здравствуйте, Страж, Вы писали:

С>Нужно перебрать элементы контейнера пока не дошли до конца или до элемента с определенным значением.


С>можно так?

С>
С>std::vector<X> v;
С>for(i = v.begin(); i != v.end() && i->y ; i++) 
С>{
С>  //обработка элементата
С>}
С>

С>или неизбежны проблемы из-за выхода за границу массива если нет элементов где y == 0?

1. можно, но небезопасно, ибо компилятор в соответствии со стандартом может (но не обязан) не выполнять все компоненты условия.
2.
template<class InputIterator, class Predicate>
InputIterator find_if(InputIterator first, InputIterator last,
                      Predicate pred)

?
Re: end() и контейнеры
От: Страж  
Дата: 25.08.08 12:38
Оценка:
всем спасибо
Re[2]: end() и контейнеры
От: Анатолий Широков СССР  
Дата: 25.08.08 12:46
Оценка:
С>>или неизбежны проблемы из-за выхода за границу массива если нет элементов где y == 0?

V>1. можно, но небезопасно, ибо компилятор в соответствии со стандартом может (но не обязан) не выполнять все компоненты условия.


Это базовая гарантия для встроенного оператора &&. Таким образом, при невыполнении i!=v.end(), i->y не будет выполнено никогда.
Re[2]: end() и контейнеры
От: Qbit86 Кипр
Дата: 25.08.08 12:49
Оценка:
Здравствуйте, vayerx, Вы писали:

V>1. можно, но небезопасно, ибо компилятор в соответствии со стандартом может (но не обязан) не выполнять все компоненты условия.


Зря ты предыдущему комментатору минус поставил, оператор && (не определённый пользователем!) действительно выполняется по короткой схеме: «Unlike &, && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false.» (ISO/IEC 14882-98, 5.14).
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: end() и контейнеры
От: skeptik_  
Дата: 25.08.08 12:49
Оценка:
Здравствуйте, vayerx, Вы писали:

V>1. можно, но небезопасно, ибо компилятор в соответствии со стандартом может (но не обязан) не выполнять все компоненты условия.


Бред.

5.14 Logical AND operator
1 The && operator groups left-to-right. The operands are both implicitly converted to type bool (clause 4). The result is true if both operands are true and false otherwise. Unlike &, && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false.

Re[2]: end() и контейнеры
От: dcb-BanDos Россия  
Дата: 25.08.08 13:02
Оценка:
Здравствуйте, vayerx, Вы писали:


V>1. можно, но небезопасно, ибо компилятор в соответствии со стандартом может (но не обязан) не выполнять все компоненты условия.


тогда по-твоему, где у меня написано if( pPointer && pPointer->DO() ) программы должны падать, а не падают....что-то здесь не так
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re[3]: end() и контейнеры
От: vayerx  
Дата: 25.08.08 13:48
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Это базовая гарантия для встроенного оператора &&. Таким образом, при невыполнении i!=v.end(), i->y не будет выполнено никогда.

Да, был неправ. Видимо, переработал %)
Re: end() и контейнеры
От: Аноним  
Дата: 25.08.08 14:38
Оценка: +2
Может std::find использовать проще?
Re[3]: end() и контейнеры
От: Vain Россия google.ru
Дата: 25.08.08 14:54
Оценка: :)
Здравствуйте, Qbit86, Вы писали:

V>>1. можно, но небезопасно, ибо компилятор в соответствии со стандартом может (но не обязан) не выполнять все компоненты условия.

Q>Зря ты предыдущему комментатору минус поставил, оператор && (не определённый пользователем!) действительно выполняется по
А определённый пользователем?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: end() и контейнеры
От: Qbit86 Кипр
Дата: 25.08.08 15:14
Оценка:
Здравствуйте, Vain, Вы писали:

Q>>Зря ты предыдущему комментатору минус поставил, оператор && (не определённый пользователем!) действительно выполняется по короткой схеме

V>А определённый пользователем?

В случае перегруженного пользователем оператора && порядок вычисления аргументов не определён. Смотри хотя бы С. Дьюхерст «Скользкие места C++» (S. Dewhurst «C++ Gotchas»), готча №14.
Глаза у меня добрые, но рубашка — смирительная!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.