Как стать автором
Обновить

Комментарии 45

QHash в Qt до сих пор ругается на double-ключ? :-)
Да, ругается. Пруф:
Отправилось случайно, сорри. Ответ — qhash.h:880: ошибка: call of overloaded 'qHash(const double&)' is ambiguous
Что то мне трудновато представить ситуацию, когда бы могли понадобится дабл или флоат ключи. Думаю и в STL без специального компаратора с допуском при сравнение, работать это будет крайне ненадежно.
Ха! Тогда почему для QMap есть?
Потому, что для мэпа, ключу достаточно, чтоб его можно было сравнивать и копировать, хотя то, что он не будет ругаться на double еще не значит, что его надо туда пихать. Для hash_map/QHash/etc нужна еще и функция хеширования, которую, понятное дело, не написали. Мало того, что очень специфическая вещь и мало кому (если вообще) понадобится, еще и не существует «логичной» реализации, которая бы подошла всем, или хотя бы большей части пользователей. Даже если оставить в стороне сомнительную идею делать ключами числа с плавающей точкой и все проблемы с этим связанные, то как высчитывать для хеш для вещественного числа в общем случае?
Я думаю, что начинающему программисту на C++ надо сначала освоить STL. Это в любом случае надо и полезно. Ну а переход на контейнеры QT делается тогда совсем легко.
Если человек начинает программирование с Qt, то тут без вариантов — Qt-контейнеры. Студия для начинающего будет, как мне кажется, сложноватой, а больше альтернатив и нет. Builder уже неактуален, DOS-варианты языка С++ даже рассматривать как-то неловко. Они со всех сторон неудобные, хотя еще преподаются.

Вообще, Qt С++ замечательно занял нишу С++ Builder'а, и он для начинающего сишника будет хорошим выбором.
Совершенно не согласен.
Мухи должны быть отдельно, а котлеты отдельно. Контейнеры STL нужно знать в первую очередь. Ведь может понадобиться программировать и без применения Qt.
Это даже представить себе трудно: начинаем изучать C++ c Qt, но при этом задействуем контейнеры STL. А контейнеры Qt что — побоку? Но их же нельзя игнорировать, они там всюду. И они ничем не хуже. Да и семантика у них почти такая же, начинающему эта разница неважна.

Да и не очень правильная практика — изучать С++ с шаблонов. Пусть новички хотя бы хэллоуворды попишут, с синтаксисом свыкнутся, общеупотребительные шаблоны кода изучат. Шутка ли, — подавляющее большинство моих сокурсников (специальность ИВТ, квалификация — инженер-программист) об STL не знали к моменту выпуска, все какие-то велосипеды городили. А вы говорите, — STL в первую очередь…
>>об STL не знали к моменту выпуска

беда… во всех книгах по С++ есть глава по STL, это получается что дальше первых глав они книги не читали, если вообще читали…
нет слов, одни эмоций…
Ничего они не читали. Украл (купил)-сдал-забыл.

Правда, не все, конечно.
Правда, некоторые не разменивались на С++, а сразу сели за C# и далее убеждали, что там все сделано для программиста. Сборщик мусора тот же… Как вы поняли, я не очень высокого мнения о таком подходе, потому что сколько бы ни было удобств для программиста в языке, без понимания, как оно устроено и с чего все начиналось, код будет сплошным Г. Так что да, одни эмоции.
С++ не краеугольный камень программирование, практика показывает что большая часть моих знакомы программистов который пишут на Java, C#, Python, PHP знают плюсы на уровне «сдал и забыл». Так что не чего страшного что твой одногрупники не знают STL, главное что бы они хорошо разобрались в том языке который они для себя выбрали.
Вообще это так, конечно. Заочно желаю своим одногрупникам писать хороший код и развиваться.
Наоборот не сложнее, а Qt учится проще и быстрее, чем pure C++
По мне так статья — это обычный пересказ Шлее. И где же QArray?
В любом случае, полезно. Книгу не нагуглить, да и не у всех она есть.
Ну хотелось бы на Хабре видеть что-то новое и интересное. А это лучше бы в вики выложить на русскоязычном комьюнити.
Есть и новое, есть и старое, есть и убогое). Кому-то будет полезно, не только хаброюзерам он и прочим пользователям интернета.
Поэтому и хочется видеть это где-нибудь здесь
developer.qt.nokia.com/wiki
да там это тоже не нужно, как по мне, это жe не более чем кривой пересказ кусков Assistant еще и с ключевыми опечатками. Например:

iowerBound() — Возвращает итератор,

или

при помощи метода containts() контейнера.


Вообще капитанская какая-то статья.
> P.S. Данная статья ориентирована на обучение начинающих программистов.
А опечатки то указанные тоже принципиально не исправляете? Чтобы «начинающие погромисты» окончательно запутались?
А я тут при чем? Статья не моя). Уверен, автор все поправит.
УПС :) Извините, обознался.
Спасибо. Исправил.
Начинание хорошее. Мы-то с вами уже выросли, для нас этот материал новым не будет. А вот есть люди, которые только ступили на эту дорогу, — им в самый раз.

Хотите новое? А загляните в прошлые топики интересующих вас блогов. Не может же быть такого, что вы всё оттуда читали, — обязательно что-нибудь найдете.

А вообще, меня жажда нового привела к изучению других языков программирования (Haskell), и это одна из лучших вещей, которая со мной случилась в этом году. Рекомендую!
Тоже заметил немного. А вообще смысл есть — многие до сих пор думают, что Qt только для GUI фреймворк.
Тогда лучше писать про сеть и бд. Честно говоря непонятно перечисление стандартных контейнеров.
+ приметивы синхронизации и высокоуровневые API по работе с ними.
Спасибо, хорошая статья для начинающищ. Что я заметил:

QByteArray очень похож на QVector, но разница заключается в том, что это не шаблонный класс, и в нем допускается хранение только элементов, имеющих размер один байт.


Шаблонный он или не шаблонный — это детали реализации. Разница в том, что QByteArray хранит байты, QVector — объекты. В QByteArray можно поместить произвольные данные, имеющие размер отличный от одного байта.

Объекты типа QByteArray можно использовать везде, где требуется промежуточное хранение данных. Количество элементов массива можно задать в конструкторе, а доступ к ним получать при помощи оператора []


QByteArray не имеет никакого отношения к начальному, промежуточному или финальному хранению данных — он предназначен для работы с бинарными данными. Хороший пример — принятые по сети данные или содержимое не текстового файла.

Одна из самых распространенных операций — обход списка для последовательного получения значений каждого элемента списка


Приведенный пример — канонический и длинный. На практике все используют макрос foreach:

foreach( QString s, QList< QString >() << "a" << "b" << "c" )
{
    qDebug() << s;
}


При создании объекта QMap нужно передать его размер в конструктор


Конструктор QMap не принимает размер.

тот размер не является, как это принято в других контейнерных классах, размером ограничивающим максимальное количество элементов


В большинстве контейнерных классов переданный размер не ограничивает максимальное количество элементов.

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


Основное назначение QSet — гарантировать, что в множестве нет повторяющихся элементов. Высокая скорость проверки «есть ли такой элемент в множестве» — это побочный эффект, так как QSet — это надстройка над QHash.
Вот просто интересно, а почему QList, а не QStringList? :)
Захотелось заодно показать конструирование через последовательность "<<" :). Насколько я понял, формат статьи — для новичков. QStringList, QVariantList и прочие готовые контейнеры — это на мой взгляд уже продвинутое использование. Если рассматривать эффективность обучения, то сразу их вываливать на голову слушателя череповато поседствиями — утонет в объеме предоставленной информации :(.
На самом деле, с QStringList operator<< тоже будет работать :) Хотя я, помнится, тоже когда не был в курсе отличий между QList и QStringList — просто не знал, что от инстанцированных шаблонов можно наследоваться.
Естественно будет, учитывая что QStringList наследуется от QList :)
Хабрапарсер коварен, съел (я так понимаю, и у вас тоже) параметры шаблона. В моих комментариях выше следует читать QList<QString> вместо QList :)
Расскажите о Q_DECLARE_METATYPE, поддержке информации о типах в Qt. Ведь там можно даже вызывать методы по имени, соединять сигналы/слоты по имени, добавлять свои типы в QVariant, создавать объекты по имени класса, проверять наличие метода в классе. Что позволяет например легко соединять в одном проекте Qt и Javascript. Вот это было бы интересно.
Какая-то бессмысленная статья, на кого она рассчитана? Если на совсем новичков, которые даже не знакомы с STL — то, они ничего не поймут. Если для людей, которые знакомы с STL — то почему здесь нет сравнения с STL, почему не указано, что практически все контейнеры Qt используют парадигму «ленивого копирования», в отличии от STL, какие у неё преимущества, недостатки.

Статья выглядит как копипаст из какого-то обзорного учебника по Qt.
С учетом того, что инвайт выдал автору некий НЛО, статья, однозначно, полезна для хабра. Для кого из людей она полезна — описано выше)
Поправьте описание QQueue. В коде объявлен стек вместо очереди и консольный вывод, если не ошибаюсь, тоже немного другой будет.
Спасибо. Поправил. Это все злобный копипаст.
НЛО прилетело и опубликовало эту надпись здесь
man неявное разделение.
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории