C vs. C++ (Концепция итераторов в C++, STL и т.д.)

Модератор: Модераторы разделов

sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: C vs. C++

Сообщение sergio »

Zeus писал(а):
18.11.2007 23:07
А откуда 4 байта-то взялось?
И это никак не зависит от кодировки?

Ну коли размер чар все та же единица, значит - 4 байта это только специфика хранения отдельных символьных литералов. Заодно они выравниваются по 32бит границе, вероятно.

Собственно, далеко не единственный пунктик, где "подмножество си" в си++ не дословно совпадает с собственно си.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Slimy
Сообщения: 1689
ОС: openSuSE 11.2 GM (GеMор едишн)

Re: C vs. C++

Сообщение Slimy »

А чем плохо смешивание? если на одном языке писаниы больше а на другом все кратко и понятно то какие проблемы? Мелкософт сосвоим дотнетом вообще машает VB с++ с# и позодреваю c и еще кто его знает чего. И все это дается как фишка офигенно крутая.
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: C vs. C++

Сообщение Uncle_Theodore »

Slimy писал(а):
19.11.2007 02:10
А чем плохо смешивание? если на одном языке писаниы больше а на другом все кратко и понятно то какие проблемы? Мелкософт сосвоим дотнетом вообще машает VB с++ с# и позодреваю c и еще кто его знает чего. И все это дается как фишка офигенно крутая.

Плохо тем, что, как уже отмечалось, подмножество "C" в C++ несколько отличается от настоящего С. И можно наделать таких ошибок, выловить которые будет исключительно трудно.
Это разные языки, предназначенные для разных вещей. Зачем их смешивать?
Знаете, такой прикол из иммигрантской жизни? Звонит тетя домой к племяннице, просит ее позвать маму (свою сестру). А та ей говорит: "Мама не может к телефону подойти, она в ванной, папе хер моет!" Разумеется, она мужу мыла волосы, hair...
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: C vs. C++

Сообщение serzh-z »

Vas писал(а):
19.11.2007 00:12
основную массу студентов, которые кроме как Turbo Pascal ничего больше в жизни не видели.
Тогда давайте не будем рассматривать худшие случаи и брать с них пример... ;)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: C vs. C++

Сообщение serzh-z »

Slimy писал(а):
19.11.2007 02:10
Мелкософт сосвоим дотнетом вообще машает VB с++ с# и позодреваю c и еще кто его знает чего.
Ну, MS для нас, в большинстве случаев, не пример, верно? И потом, стоит разделять мух и котлеты, .NET далеко не ужасная вещь (более того, ничего там не смешивается - существует достаточно строгая CLS, вокруг которой все языки и сгруппированы) - и спроектирована эта платформа совсем не на коленке.
Спасибо сказали:
Аватара пользователя
nrg
Сообщения: 219
Статус: Энерджайзер :)
ОС: OpenSuSe 10.3

Re: C vs. C++

Сообщение nrg »

serzh-z писал(а):
19.11.2007 03:20
Slimy писал(а):
19.11.2007 02:10
Мелкософт сосвоим дотнетом вообще машает VB с++ с# и позодреваю c и еще кто его знает чего.
Ну, MS для нас, в большинстве случаев, не пример, верно? И потом, стоит разделять мух и котлеты, .NET далеко не ужасная вещь (более того, ничего там не смешивается - существует достаточно строгая CLS, вокруг которой все языки и сгруппированы) - и спроектирована эта платформа совсем не на коленке.


Подозреваю, что имелось в виду CLR, а не CLS :blush: .
А топикстартеру хотелось бы порекомендовать для удобства себя и окружающих завести аккаунт на http://code.google.com/hosting/createProject и выложить все сорцы в SVN репозиторий, ибо сорцы и изменения в них через мордочку свна смотреть очень удобно. Заодно появятся навыки работы с системами контроля версий.
OpenSuSe 10.3 на Dell Inspiron 1501 и Семпрон-3000/1024ДДР2-800/120+60+300/NVidia 8500GT.
Участник Sun Open Source User Group, Самара.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: C vs. C++

Сообщение v04bvs »

Uncle_Theodore писал(а):
19.11.2007 02:32
Плохо тем, что, как уже отмечалось, подмножество "C" в C++ несколько отличается от настоящего С.

Если забыть про C99, то отличия эти больше формально-академические.

И можно наделать таких ошибок, выловить которые будет исключительно трудно.

На C/C++ вообще легко наделать ошибок, которые исключительно трудно вылавливать. Это вопрос профессионализма.

Это разные языки, предназначенные для разных вещей. Зачем их смешивать?

Во-первых это ни разу не смешивание.
#define INT_MAX 123456
это абсолютно легальный С++ код. В стандарте написано, что climits включается в поставку C++.
Да, здесь классические случай того, что есть несколько путей сделать одно и то же.
И по-моему все апологеты программирования вообще, и юникса в частности кричат Keep It Simple!
Для чего примешивать ненужные сложности там, где без них можно обойтись, ничего не потеряв?
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: C vs. C++

Сообщение deninok »

Да, приведенный тобой пример - это абсолютно легальный С++ код. Однако использование препроцессора в С++ вообще должно быть сведено к минимуму, насколько это возможно.
А что касается принципа K.I.S.S., упомянутого тобой, то здесь очень важно понять, что есть простота. Да, нужно (и даже необходимо) стремится к простоте в программировании, но какой смысл мы вкладываем в понятие "простота"? Например, использование стандартной библиотеки С++ многие программисты считают сложностью, однако она, эта библиотека, была создана как раз для того, чтобы упростить жизнь программисту, а не для того, чтобы усложнять ее. Понятие "простота" вообще весьма относительно. И, кстати, многими оно часто путается с понятием "примитивность". А простота и примитивность - не одно и то же.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: C vs. C++

Сообщение serzh-z »

nrg писал(а):
19.11.2007 08:17
Подозреваю, что имелось в виду CLR, а не CLS :blush: .
Имелось в виду именно CLS - Common Language Specification.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C vs. C++

Сообщение drBatty »

sizoff(char) == 1
по определению.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: C vs. C++

Сообщение Liksys »

drBatty, а sizof('z')? Читай стандарт про строковые и символьные литералы.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: C vs. C++

Сообщение Uncle_Theodore »

А хотите еще прикол?
Вот этот код выдает предупреждение при компиляции, но работает нормально. А вот вопрос на засыпку, что он выдает?

Код: Выделить всё

#include <stdio.h>

int main()
{
  printf("%d\n", sizeof('xyz'));

  return 0;
}
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: C vs. C++

Сообщение Liksys »

Он должен ругнуться на то, что многосимвольная константа, попытается преобразовать его в строковый литерал неявно выдаст ответ 4, три символа плюс нулевой. Так наверно.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: C vs. C++

Сообщение Uncle_Theodore »

Liksys писал(а):
19.11.2007 22:46
Он должен ругнуться на то, что многосимвольная константа, попытается преобразовать его в строковый литерал неявно выдаст ответ 4, три символа плюс нулевой. Так наверно.

Ответ почти правильный. Но не совсем. :)
Выдаст 4. Точно так же, как если заменить 'xyz' на 'xy', например... Так что конвертации никакой нет.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: C vs. C++

Сообщение Liksys »

Ааа, понял :)
Кстати, если попробовать использовать такую штуку - сегфолтнуться может.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: C vs. C++

Сообщение Uncle_Theodore »

Liksys писал(а):
19.11.2007 22:53
Ааа, понял :)
Кстати, если попробовать использовать такую штуку - сегфолтнуться может.

Да, эта фишка описана как платформозависимая и непортируемая. Посему нехорошая.
Но в принципе, на литерную константу выделяется четыре байта памяти, поэтому в ней можно разместить больше одного литерала. До четырех.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: C vs. C++

Сообщение Liksys »

Только надо учесть нулевой символ.
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: C vs. C++

Сообщение sergio »

Чо-то я недопонял, с каких пор у нас у литерной константы (в одинарных кавычках т.е., не строковой) появился нулевой символ??
С какой радости компилятор пропускает литерную константу из нескольких символов базового набора символов, когда там вроде как по-определению должен быть один, мне как-то тоже не ясно...
Не буду на си писать, хрень какую-то в нем развели. :laugh:


О, гыгы. Чем дальше в лес тем толще партизаны. В плюсах тот же бред у g++ - только ворнинги и все. Причем размер бредолитерала 'xyz' равно как и 'xy' - 4, как и в си. :laugh:
А если скормить это щастье printf("%c") то выводит последний символ из перечисленных. :laugh:
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: C vs. C++

Сообщение watashiwa_daredeska »

drBatty писал(а):
18.11.2007 14:11
получится. просто ты язык слабо знаешь ;)


Спорить не буду. Может, подскажешь, пару вещей: как на C++ организовать загрузку shared object'ов (dll) и как писать инициализаторы для C++-типов типа std::vector и std::list (что-то вроде C-шного int a[] = {1,2,3};)?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: C vs. C++

Сообщение watashiwa_daredeska »

deninok писал(а):
19.11.2007 11:50
Однако использование препроцессора в С++ вообще должно быть сведено к минимуму, насколько это возможно.

Это чем-то обусловлено, кроме того, что макры можно легко заменить copy-paste'ом?

deninok писал(а):
19.11.2007 11:50
Например, использование стандартной библиотеки С++ многие программисты считают сложностью, однако она, эта библиотека, была создана как раз для того, чтобы упростить жизнь программисту, а не для того, чтобы усложнять ее. Понятие "простота" вообще весьма относительно. И, кстати, многими оно часто путается с понятием "примитивность". А простота и примитивность - не одно и то же.

Из "не-примитивности" не должно с неизбежностью следовать увеличение объема кода на порядок и увеличение числа сущностей. В случае с INT_MAX у нас одна сущность -- константа, это видно невооруженным глазом, особенно при соблюдении coding conventions, в случае с numeric_limits<int>::max() -- вообще с первого взгляда не понятно что это, где и почему, пока не разберешься, что это вызов статического метода темплейтного класса, про который в документации написано, что он возвращает константу.

Про некоторые прочие прелести стандартной библиотеки тоже можно много порассказать, особенно про алгоритмы.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: C vs. C++

Сообщение deninok »

(watashiwa_daredeska) писал(а):
(deninok) писал(а):Однако использование препроцессора в С++ вообще должно быть сведено к минимуму, насколько это возможно.

Это чем-то обусловлено, кроме того, что макры можно легко заменить copy-paste'ом?

Обусловлено. В первую очередь тем, что препроцессор не знает С++. И он может быть очень опасен по отношению к типам. Ведь для препроцессорного константного макроса, такого как
#define A 100
не определен тип. Использование препроцессора чревато хитрыми ошибками, которых никогда не допустил бы компилятор.
В соответствии со стандартом программирования на С++, разработанным с участием Страуструпа, использование препроцессора должно быть сведено ТОЛЬКО к двум ситуациям:
1. Включение заголовочников директивой #include
2. Защита заголовочника от повторного его включения в единицу трансляции директивами ##ifndef, #define и #endif

(watashiwa_daredeska) писал(а):Из "не-примитивности" не должно с неизбежностью следовать увеличение объема кода на порядок...

На порядок? Не думаю.

(watashiwa_daredeska) писал(а):... и увеличение числа сущностей. В случае с INT_MAX у нас одна сущность -- константа, это видно невооруженным глазом, особенно при соблюдении coding conventions, в случае с numeric_limits<int>::max() -- вообще с первого взгляда не понятно что это, где и почему...

Что значит "непонятно"? Это уж кому как, от опыта зависит.

(watashiwa_daredeska) писал(а):...пока не разберешься, что это вызов статического метода темплейтного класса, про который в документации написано, что он возвращает константу.

О! Значит, перед использованием стандартной библиотеки ее необходимо (хотя бы в основе своей) изучить. Разве это плохо? Если я хочу использовать инструмент, то сначала нужно научиться, не так ли?

(watashiwa_daredeska) писал(а):Про некоторые прочие прелести стандартной библиотеки тоже можно много порассказать, особенно про алгоритмы.

Мне, как начинающему программисту, будет интересно услышать о прелестях библиотеки. Расскажите, пожалуйста.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: C vs. C++

Сообщение watashiwa_daredeska »

deninok писал(а):
20.11.2007 11:57
препроцессор не знает С++. И он может быть очень опасен по отношению к типам.

Да, в некоторых случаях макросы вызывают сложности и требуют аккуратности, но copy-paste -- это "примитив". Разверну, так сказать, ваше оружие против вас же -- либо примитивный copy-paste, либо макросы, как более сложный, но и более удобный инструмент.

deninok писал(а):
20.11.2007 11:57
На порядок? Не думаю.

В данном случае, 7 символов против 26, т.е. в ~3.71 раза. Да, не на порядок, но на полпорядка.

deninok писал(а):
20.11.2007 11:57
Что значит "непонятно"? Это уж кому как, от опыта зависит.

Вы никогда не видели код, переполненный всякими шаблонными штучками? Я видел. Разница в чтении -- примерно как ландафшица после сивухина читать. Сивухина читаешь -- да, надо думать, но тем не менее, читается, возьмешь ландафшица -- на очередном "очевидно, что" исписываешь 5 листов бумаги, пока тебе станет очевидно, хотя все исходные данные для "очевидно", вроде как есть. Так и тут -- вроде бы ничего непонятного, библиотеку действительно надо знать, но вот не читается вся эта абракадабра, хоть тресни, потому что написанное не говорит само за себя, не возникает в голове ассоциативных связей.

deninok писал(а):
20.11.2007 11:57
Мне, как начинающему программисту, будет интересно услышать о прелестях библиотеки. Расскажите, пожалуйста.

Начать хотя бы с совершенно дикой идеи "итераторов" в STL. Итератор, как говорит само название, предназначен для итерирования, а не для сортировки, перестановок и прочей фигни. Соответственно, для представления последовательности достаточно одного итератора, который содержит флажок "конец последовательности". Этот один итератор можно просто вернуть из функции, например, или легко создать производный итератор, который, например, итерирует не по всем элементам, а только по тем, которые удовлетворяют предикату. Необходимость же определять последовательность двумя итераторами (начало, конец), ломает всю идиллию. В результате, такой очевидной вещи, как "фильтрующий итератор", в STL нет. Т.е. итераторы C++ (aka "generalized pointers") -- тяжелое наследие C, если б C++ был достаточно самостоятельным языком, такой бред бы не родился, как не родился от ни в одном известном мне ЯВУ.

Алгоритмы -- это вообще пределесть, с учетом отсутствия нормальных анонимных функций (boost::lambda не предлагать). В 99% случаев проще написать for, чем сгородить отдельный класс "функтора" -- по крайней мере, весь алгоритм будет в одном месте описан, а не раскидан кусками по исходникам. Еще в 0.9% лучше также писать for для единообразия. И лишь в оставшихся 0.1% случаев действительно удобно использовать алгоритмы STL.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: C vs. C++

Сообщение deninok »

(watashiwa_daredeska) писал(а):Вы никогда не видели код, переполненный всякими шаблонными штучками? Я видел. Разница в чтении -- примерно как ландафшица после сивухина читать. Сивухина читаешь -- да, надо думать, но тем не менее, читается, возьмешь ландафшица -- на очередном "очевидно, что" исписываешь 5 листов бумаги, пока тебе станет очевидно, хотя все исходные данные для "очевидно", вроде как есть. Так и тут -- вроде бы ничего непонятного, библиотеку действительно надо знать, но вот не читается вся эта абракадабра, хоть тресни, потому что написанное не говорит само за себя, не возникает в голове ассоциативных связей.

Ну, я полагаю, что виноваты в этом не сами шаблоны, а то, как (тот или иной) программист их использует. Деннис Ритчи, создатель языка С, так сказал о своем творении: "Язык С похож на скальпель: в руках профессионала - излечение от болезни, в руках дилетанта - кровавое месиво". Так же и шаблоны. В руках дилетанта они могут ТАК замусорить код, что плакать захочется. Подобный код я видел. Однако я также видел и очень красивый, легко читабельный код с шаблонами. Думаю, все дело в дилетантизме одних и профессионализме других... Это относится не только к шалонам.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: C vs. C++

Сообщение watashiwa_daredeska »

deninok писал(а):
20.11.2007 14:49
Ну, я полагаю, что виноваты в этом не сами шаблоны, а то, как (тот или иной) программист их использует.

И это тоже, конечно, но есть определенные но. В отличие от макросов LISP, которые позволяют переделывать код как угодно, шаблоны C++ серьезно ограничены в возможностях. В сложных случаях приходится изобретать решение, которое красиво и удобно "снаружи" и может быть реализовано. Часто на это просто нет времени, поэтому реализуется последний приемлемый из придуманных вариантов.
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: C vs. C++

Сообщение sergio »

watashiwa_daredeska писал(а):
20.11.2007 14:20
deninok писал(а):
20.11.2007 11:57
Мне, как начинающему программисту, будет интересно услышать о прелестях библиотеки. Расскажите, пожалуйста.

Начать хотя бы с совершенно дикой идеи "итераторов" в STL. Итератор, как говорит само название, предназначен для итерирования, а не для сортировки, перестановок и прочей фигни. Соответственно, для представления последовательности достаточно одного итератора, который содержит флажок "конец последовательности". Этот один итератор можно просто вернуть из функции, например, или легко создать производный итератор, который, например, итерирует не по всем элементам, а только по тем, которые удовлетворяют предикату. Необходимость же определять последовательность двумя итераторами (начало, конец), ломает всю идиллию. В результате, такой очевидной вещи, как "фильтрующий итератор", в STL нет. Т.е. итераторы C++ (aka "generalized pointers") -- тяжелое наследие C, если б C++ был достаточно самостоятельным языком, такой бред бы не родился, как не родился от ни в одном известном мне ЯВУ.

В словарь загляните.
iterate
гл.
1) повторять, говорить или делать что-то еще раз
Syn:
repeat, review
2) мат. производить итерацию (повторно применять какие-л. математические операции)

Итератор - это повторитель, перебиратель. Поинтер, способный указывать на очередной элемент множества и сдвигаться на следующий элемент того же множества, или быть принудительно связан с любым другим. Полностью соответствует своему названию. Это ваша ошибка раз.
Никакими "сортировками, перестановками и прочей фигней" итераторы никогда не занимались. Это ваша ошибка два.
Итератор не может представлять последовательность, что ясно следует из его названия. И никогда ее не представлял (в СИ++). Это ваша ошибка три.
Фильтрующие итераторы прекрасно создаются при необходимости и, кстати, поищите их в буст. Эта ваша ошибка четыре.
Что до инсинуаций дескать система итераторов с Си++ - бред, то могу ответить только, что ваши попытки рассуждать на эту тему ничего кроме полного непонимания сути вещей не показали, и оттого тоже могут быть названы бредом.

Алгоритмы -- это вообще пределесть, с учетом отсутствия нормальных анонимных функций (boost::lambda не предлагать). В 99% случаев проще написать for, чем сгородить отдельный класс "функтора" -- по крайней мере, весь алгоритм будет в одном месте описан, а не раскидан кусками по исходникам. Еще в 0.9% лучше также писать for для единообразия. И лишь в оставшихся 0.1% случаев действительно удобно использовать алгоритмы STL.

Вас что, кто-то заставляет использовать foreach когда он вам не нужен? вы где-то прочитали, что std::foreach призван повсеместно заменить цикл for?
Не хотите писать функтор - используйте готовые, они есть. Не подходят, и писать не хотите - пишите цикл. Если в одном месте он нужен - кто же возражает? А если в пяти - это ваше дело, хотите ли вы все же написать функтор, или будете мучиться выбирая между макросами и копи-пейстом. :happy:

Пустой разговор на самом деле. Не нравится вам язык - не пишите на нем. Есть много более других. Возможно вам больше подойдет VB или перл. Там есть foreach, и никаких функторов для этого писать не надо. Вам не нравятся итераторы си++, а мне не понравились "итераторы" в ява - как раз такие, как вам нравятся. Не надо циклится на отрицательных эмоциях, надо искать источники положительных. :happy:
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: C vs. C++

Сообщение watashiwa_daredeska »

sergio писал(а):
20.11.2007 21:01
В словарь загляните.

iterator сущ.
выч. итератор (устройство или программа организации циклов); периодизатор; программа организации циклов

Расскажите, как InputIterator организует цикл в std::sort.

sergio писал(а):
20.11.2007 21:01
Никакими "сортировками, перестановками и прочей фигней" итераторы никогда не занимались. Это ваша ошибка два.

Они, в целом, расчитаны на это. Без этого невозможно было бы реализовать std::sort, std::remove, ...

sergio писал(а):
20.11.2007 21:01
Итератор не может представлять последовательность, что ясно следует из его названия. И никогда ее не представлял (в СИ++). Это ваша ошибка три.

Может. Из названия следует, что итератор -- это программа (объект, функция, еще какая фигня) для организации цикла, в частности, по последовательности. Возможно, по виртуальной последовательности. Логичное следствие -- один итератор организует один цикл. А не два итератора, которые могут к тому же оказаться от разных последовательностей.

sergio писал(а):
20.11.2007 21:01
Фильтрующие итераторы прекрасно создаются при необходимости и, кстати, поищите их в буст. Эта ваша ошибка четыре.

Я их там давно нашел. Довольно ограниченные возможности, надо сказать. Особенно, если задача хорошо ложится на идею потоков объектов и "фильтров", что-то вроде шелловского: command | grep pattern | sort | uniq.

sergio писал(а):
20.11.2007 21:01
Что до инсинуаций дескать система итераторов с Си++ - бред, то могу ответить только, что ваши попытки рассуждать на эту тему ничего кроме полного непонимания сути вещей не показали, и оттого тоже могут быть названы бредом.

Ну-ка, ну-ка, что там за суть у вещей?

sergio писал(а):
20.11.2007 21:01
Вас что, кто-то заставляет использовать foreach когда он вам не нужен? вы где-то прочитали, что std::foreach призван повсеместно заменить цикл for?

Я этого не говорил. Однако, во-первых, это рекомендуется во всех C++-книгах как истинный C++-стиль, во-вторых, товарищи выше предлагали на полную катушку пользоваться "великолепной" STL везде, где можно, в предпочтение C-стилю.

sergio писал(а):
20.11.2007 21:01
Не хотите писать функтор - используйте готовые, они есть. Не подходят, и писать не хотите - пишите цикл. Если в одном месте он нужен - кто же возражает? А если в пяти - это ваше дело, хотите ли вы все же написать функтор, или будете мучиться выбирая между макросами и копи-пейстом. :happy:

У меня несколько другой опыт по поводу того, где же на самом деле кроется львиная доля copy-paste.

sergio писал(а):
20.11.2007 21:01
Пустой разговор на самом деле. Не нравится вам язык - не пишите на нем. Есть много более других. Возможно вам больше подойдет VB или перл. Там есть foreach, и никаких функторов для этого писать не надо. Вам не нравятся итераторы си++, а мне не понравились "итераторы" в ява - как раз такие, как вам нравятся. Не надо циклится на отрицательных эмоциях, надо искать источники положительных. :happy:

Поверьте, я на самом деле весел и жизнерадостен. Испытывать какие-то сильные эмоции от общения на форуме я просто не в состоянии. Однако, "истина -- как грибы", как известно.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: C vs. C++

Сообщение deninok »

(watashiwa_daredeska) писал(а):
(sergio) писал(а):Вас что, кто-то заставляет использовать foreach когда он вам не нужен? вы где-то прочитали, что std::foreach призван повсеместно заменить цикл for?

Я этого не говорил. Однако, во-первых, это рекомендуется во всех C++-книгах как истинный C++-стиль...

Это не так. Понятие "истинный С++-стиль" достаточно относительно. Цикл for очень хорошо вписывается в С++ стиль, это говорит и Страуструп.

(watashiwa_daredeska) писал(а):...во-вторых, товарищи выше предлагали на полную катушку пользоваться "великолепной" STL везде, где можно, в предпочтение C-стилю.

Да. Однако, как уже было сказано выше, STL можно пользовать по-разному, и результат будет или плачевный, или великолепный. Кстати, стандартной библиотекой С можно тоже пользоваться по-разному... И код, написанный на С, может быть и ужасен, и прекрасен. Все зависит от программиста. Я видел С-шный код, которому за читабельность два с минусом поставить нужно.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: C vs. C++

Сообщение deninok »

По-моему, обсуждение уходит в оффтоп относительно начатой темы. Может, это интересную дискуссию перенесут в отдельную тему?
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: C vs. C++

Сообщение sergio »

watashiwa_daredeska писал(а):
21.11.2007 11:15
iterator сущ.
выч. итератор (устройство или программа организации циклов); периодизатор; программа организации циклов

Расскажите, как InputIterator организует цикл в std::sort.

Морфологию слов иногда полезно учитывать, а словарем стоит пользоваться с умом. Это между нами.
То, что вы привели - это не значение слова, а узкоспециальная трактовка слова, его толкование, выполненное неизвестным мне специалистом. Расскажите пожалуйста, в каком ЯВУ итераторы являются "программой организации циклов"?
Возможно, вы откроете мне глаза на истину, но во всех мне известных ЯП циклы создавались конструкциями циклов, за исключением гениального смоллток, где они реализуются через рекурсивную посылку сообщения специализированному объекту. И ни в одном не припомню, чтобы упоминались итераторы как "программа оргазации циклов". Поэтому для меня цена приведенного вами толкования - соответствующая. За чужую (не)компетентность я не отвечаю - вопросы к автору того словаря плиз. Ничего общего с итераторами в Си++ его толкование не имеет. Да и с остальными ЯП тоже не понятно как связано.
А значение слова, с учетом морфологии и общего использования, я приводил выше. Как ни странно, но СИ++ оно не противоречит.

sergio писал(а):
20.11.2007 21:01
Никакими "сортировками, перестановками и прочей фигней" итераторы никогда не занимались. Это ваша ошибка два.

Они, в целом, расчитаны на это. Без этого невозможно было бы реализовать std::sort, std::remove, ...

Алгоритмы стандартной библиотеки используют итераторы. Но сами итераторы ничего не сортируют. Все четко. В введениях к СТЛ обычно объясняют именно то, что итераторы обеспечивают компактную и эффективную абстракцию для доступа алгоритмов к элементам множеств. Поэтому итераторы и не наделены собственной высокоуровневой логикой в общем случае, и не должны без необходимости плодиться в вариациях - чтобы не плодить копии алгоритмов под чуть-чуть разные типы. Плюс возможность использовать указатели в качестве итераторов для максимума эффективности. А в плюсах эффективность все же в первых рядах, иначе давно бы их забросили.

sergio писал(а):
20.11.2007 21:01
Итератор не может представлять последовательность, что ясно следует из его названия. И никогда ее не представлял (в СИ++). Это ваша ошибка три.

Может. Из названия следует, что итератор -- это программа (объект, функция, еще какая фигня) для организации цикла, в частности, по последовательности. Возможно, по виртуальной последовательности. Логичное следствие -- один итератор организует один цикл. А не два итератора, которые могут к тому же оказаться от разных последовательностей.

Эти рассуждение только следствие из найденного вами определения. И рассуждаете вы так при этом, как будто для вас программа, объект, функция и "еще какая фигня" - одно и то же. Что, правда одно и то же?? :happy: Вы уж определитесь тогда. А то программа - это обычно самостоятельная единица на уровне операционной системы, все-таки... Так чего, у нас что-то типа /bin/iterator есть? :happy:

Я их там давно нашел. Довольно ограниченные возможности, надо сказать. Особенно, если задача хорошо ложится на идею потоков объектов и "фильтров", что-то вроде шелловского: command | grep pattern | sort | uniq.

Вы бы рассказали, под какую ситуацию вам чего не хватает, почему там плюсовые недоитераторы плохи, и как вы это предлагает решать с "правильными итераторами". Так-то чего говорить - из пустого в порожнее, религиозные убеждения и ничего более.

Ну-ка, ну-ка, что там за суть у вещей?

Итератор - поинтер на элемент некой произвольно упорядоченной последовательности, обеспечивает косвенный доступ элементу, может быть перемещен на другой элемент или на мнимый элемент за концом. Для N числа элементов как-либо упорядоченных в последовательность, может быть одновременно задано и недеструктивно использовано (N + 1)! различных (под-)последовательностей, заданных соответствующим количеством пар итераторов одного типа. Замечу лишний раз, что никаких перестановок и сортировок итераторы не выполняют. Они только обеспечивают возможность ссылаться на элементы...
Расскажите пожалуйста, как подобная гибкость достигается якобы-правильными итераторами?

Я этого не говорил. Однако, во-первых, это рекомендуется во всех C++-книгах как истинный C++-стиль, во-вторых, товарищи выше предлагали на полную катушку пользоваться "великолепной" STL везде, где можно, в предпочтение C-стилю.

Уже ответили до меня. И на счет "всех сиплюс книг" не уверен, и свою голову никто не отменял, и циклы фор являются вполне истинной конструкцией си плюс, а не сугубо "Си-стилем"... Так что... чего бороться с мельницами?


deninok писал(а):
21.11.2007 13:35
По-моему, обсуждение уходит в оффтоп относительно начатой темы. Может, это интересную дискуссию перенесут в отдельную тему?

А оно туда ушло с первых же постов. :happy:
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: C vs. C++

Сообщение v04bvs »

sergio писал(а):
21.11.2007 16:08
Расскажите пожалуйста, в каком ЯВУ итераторы являются "программой организации циклов"?

Java: для использования foreach необходимо, чтобы класс имел метод iterator(), т.е. итераторы и циклы связаны как нельзя более тесно.
Спасибо сказали: