Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> что предпочтительнее, ??? 
:(
    Опции темы
bsa
Дата 21.7.2010, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(mes @  21.7.2010,  10:55 Найти цитируемый пост)
djamshud, ловите и пилите ( она золотая © )
Во-первых, в твоем коде есть выход за пределы массива. Во-вторых, имхо, один if лишний. А в-третьих, есть ограничения на тип элемента массива - он должен быть свободно конвертируемым в int.
PM   Вверх
borisbn
Дата 21.7.2010, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



bsa, выход за пределы не увидел, зато увидел, что выполняется на один раз меньше, чем элементов в векторе из-за ++curr_  < count_ в условии выхода, которое проверяется сразу после int val_ = vec_[curr_]



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 21.7.2010, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



а. точно. я почему-то проглядел это место, так как для меня было бы логичней curr_++ < count...
PM   Вверх
mes
Дата 21.7.2010, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  21.7.2010,  10:01 Найти цитируемый пост)
 что выполняется на один раз меньше

да это есть.. :( 

Цитата(bsa @  21.7.2010,  09:47 Найти цитируемый пост)
в-третьих, есть ограничения на тип элемента массива

ну там предполагалось, что вместо инт будет стоять typeof из "оригинала".. я просто не стал "утруждать" им codepad
smile

Цитата(bsa @  21.7.2010,  09:47 Найти цитируемый пост)
один if лишний.

возможно,  для этого и было "пилите"
smile



--------------------
PM MAIL WWW   Вверх
mes
Дата 21.7.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(bsa @  21.7.2010,  10:45 Найти цитируемый пост)
 было бы логичней curr_++ < count... 

a виной тому, что не хотелось использовать два fora :(
вот исправленный вариант : http://codepad.org/gF277K0i
smile

заодно "оставил" задание типа программистом. 
smile



--------------------
PM MAIL WWW   Вверх
djamshud
Дата 21.7.2010, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



mes, спасибо. Странная вещь, я всегда думал, что внутри if нельзя никак определить переменную... Но ваш пример foreach-а, мне кажется, неудачен как минимум тем, что в val_ порисходит копирование из вектора.

>typeof в msvc нет и не будет, его нет в С++0х, там есть decltype,

Лично мне пофиг. Если мне нужно портировать свой софт под винду, я воспользуюсь GCC. Да и не нужно это как правило, ибо системнозависимый он обычно.

>std::for_each(v.begin(), v.end(), [](T x){ ... });

Удобно аж до абассаки.

Итак. Вот что получилось, работает и с continue и c break.

Код

#define foreach(container,value) \
for(size_t __i=0,__keep=0;__keep!=1&&__i<(container).count();__i++) \
for(typeof((container)[0]) &value=(container)[__i];(__keep=1);({__keep=0;break;}))


Код

int buf[]={1,2,3,4,5};
vector<int> vct(buf,5,pod_alloc);

foreach(vct,value)
stDebug("%d",value);

stDebug("-------");

foreach(vct,value){
if(value==1)continue;
if(value==4)break;
stDebug("%d",value);}


Код

Wed Jul 21 13:21:12 2010 in src/index.cpp:12: 1
Wed Jul 21 13:21:12 2010 in src/index.cpp:12: 2
Wed Jul 21 13:21:12 2010 in src/index.cpp:12: 3
Wed Jul 21 13:21:12 2010 in src/index.cpp:12: 4
Wed Jul 21 13:21:12 2010 in src/index.cpp:12: 5
Wed Jul 21 13:21:12 2010 in src/index.cpp:14: -------
Wed Jul 21 13:21:12 2010 in src/index.cpp:19: 2
Wed Jul 21 13:21:12 2010 in src/index.cpp:19: 3


Из GCC-измов используется typeof и ({}). От последнего можно отказаться, но код чуть усложнится. От первого тоже можно, но, как уже писал, сантаксического сахара станет меньше.

Добавлено через 2 минуты и 21 секунду
Знатоки ассемблеров, если вам не лень, оцените насколько этот код отсасывает у обычного

Код

for(size_t i=0;i<vct.count();i++)
...



--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mes
Дата 21.7.2010, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(djamshud @  21.7.2010,  11:30 Найти цитируемый пост)
как минимум тем, что в val_ порисходит копирование из вектора.

 там позже еще один вариант предложен... что в принципе соответствует вашему последнему..


Цитата(djamshud @  21.7.2010,  11:30 Найти цитируемый пост)
От первого тоже можно, но, как уже писал, сантаксического сахара

зато свободы у программиста больше.. хотя бы в возможности указать константность.


Это сообщение отредактировал(а) mes - 21.7.2010, 12:44


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 21.7.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



>зато свободы у программиста больше.. хотя бы в возможности указать константность.

Зачем ее самому указывать? Если контейнер - константа, то и его operator[] возвращает константу, typeof это выловит и сам все сделает. Если же не использовать typeof, наоборот придется самому следить за этим. Но с другой стороны в моем варианте нельзя указать, что нужно использоваться ссылку на константу при работе с неконстантым контейнером, но это не так уж и важно, я думаю...

Второй вариант потом увидел. Да, по смыслу похоже.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2825 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.