crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Массивы
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Obey-Kun Дата 2.12.2010, 23:19
  Мне вот эта строка в память отложилась: «Qt предоставляет свои реализации строк, контейнеров и алгоритмов в качестве упрощенной кроссплатформенной альтернативы для STL». Из этой статьи — http://www.ibm.com/developerworks/ru/library/l-qt_3/. Просто отложилась неправильно :).
Да, вряд ли найдётся нечто, где STL не портировали, а Qt есть. Cпорить не буду, т.к. если мыслить в таком ключе, то ты прав.
Алексей1153 Дата 2.12.2010, 22:28
 
Цитата(Obey-Kun @ 3.12.2010, 0:11) *
Контейнеры в Qt создали в том числе потому потому, что STL в полной мере реализован не везде. Так что если делать кроссплатформенное ПО, то не вижу смысла от них отказываться. Если честно, я вообще не вижу смысл не использовать все фичи Qt, если в проекте используется Qt.

интересно, где реализована поддержка Qt без STL. приведи примеры ? А вот STL - истинно кроссплатформенный. Да и привычнее :)

Они создали свои контейнеры по другой причине ИМХО - с оглядкой на специфику Qt. С поддержкой многопоточности (где-то мелькало на форуме). А STL - это верх минимализма, а если хочется многопоточности, обёртывай в класс и комбинируй с синхронизаторами. То есть, терять в производительности можно в зависимости от задачи, а не по принуждению всегда
Obey-Kun Дата 2.12.2010, 22:11
 
Цитата
я пользуюсь STL, так как это стандарт языка. Кутешными контейнерами пользуюсь только при необходимости - когда метод требует ссылку. А

Контейнеры в Qt создали в том числе потому потому, что STL в полной мере реализован не везде. Так что если делать кроссплатформенное ПО, то не вижу смысла от них отказываться. Если честно, я вообще не вижу смысл не использовать все фичи Qt, если в проекте используется Qt.

Цитата
qrand()/RAND_MAX - обеспечивает коэффициент 0.0<k<1.0 (не ставлю <=, так как такого не бывает в реальности ))) )

Упс, я там накосячил ещё и накосячил, верно. Короче, дурацкий у меня подход, qrand()%(max+1) гораздо лучше (если мы хотим число от 0 до max).
Алексей1153 Дата 2.12.2010, 20:59
  Obey-Kun, я пользуюсь STL, так как это стандарт языка. Кутешными контейнерами пользуюсь только при необходимости - когда метод требует ссылку. А "at" тоже не пользуюсь, так как я всегда контролирую индекс (чего и всем советую :) ) Це не фича, а скорость (собственно, привычка контролировать индекс проистекает из того, что я начал пользовать STL с год назад, а до этого активно отрицал, пока вдруг не понял, что это наигрался с низким уровнем до нехочу, а STL - это существенное увеличение скорости написания программ + меньше глюков по невнимательности)

про '0' в условии задачи нету :)

Цитата(Obey-Kun @ 2.12.2010, 21:30) *
qrand()%v.size(), пока не понял, что это действительно будет число от 0 до v.size()-1 . Просто я всегда делаю qRound(max*qrand()/RAND_MAX),

это немного разное:

qrand()/RAND_MAX - обеспечивает коэффициент 0.0<k<1.0 (не ставлю <=, так как такого не бывает в реальности ))) )

N%v.size() - обеспечивает невыход за границу массива (хотя, впрочем, распределение будет примерно таким же)
Obey-Kun Дата 2.12.2010, 19:30
 
Цитата(Алексей1153 @ 2.12.2010, 15:03) *
вот так можно
std::vector<char> v('Z'-'A'+1 + 'z'-'a'+1+ '9'-'1'+1,0);

for(char c='A'; c<='Z';c++) v.push_back(c);
for(char c='a'; c<='z';c++) v.push_back(c);
for(char c='1'; c<='9';c++) v.push_back(c);

char randomChar=v[qrand()%v.size()];


можно и без вектора, конечно, обойтись. Но придётся вручную вбивать статический массив символов. Но оно того не стОит, если операция разовая

Во-первых, почему std::vector, а не QVector?
Во-вторых, раз уж использовать std::vector, то лучше использовать его фичу по контролю размера — использовать метод at(), а не оператор [].
В-третьих, ты забыл про 0. По таблице ASCII, 0 находится перед 1, значит надо for(char c='0'; c<='9';c++).

Кстати, сначала тупил над qrand()%v.size(), пока не понял, что это действительно будет число от 0 до v.size()-1 :). Просто я всегда делаю qRound(max*qrand()/RAND_MAX), но твой подход получше будет :). За это спасибо.

А ещё можно обойтись без массивов. Но если честно, мне код писать лень.

И ещё, автор, не забудь сделать qsrand() :).
Алексей1153 Дата 2.12.2010, 19:14
  Dimix, я точно не ошибся ? Надо на языке Си++ ? Или на каком другом ? ))

>>Что такое std::vector?
STL - контейнер, шаблонный класс. Можно заменить статическим массивом, если "не проходили"

>>Почему диапазон задается задом на пред?
>>Почему +1+ между диапазонами и что значит 0 в конце?
символы идут подряд, поэтому я вичислил длину массива под эти символы:

последний_символ-первый_символ+1


>>Почему qrand()?
потому что гладиолус (с) :D
Цитата
int qrand ()
Thread-safe version of the standard C++ rand() function.

Returns a value between 0 and RAND_MAX (defined in <cstdlib> and <stdlib.h>), the next number in the current sequence of pseudo-random integers.

Use qsrand() to initialize the pseudo-random number generator with a seed value.

This function was introduced in Qt 4.2.

See also qsrand().

void qsrand ( uint seed )
Thread-safe version of the standard C++ srand() function.

Sets the argument seed to be used to generate a new random number sequence of pseudo random integers to be returned by qrand().

The sequence of random numbers generated is deterministic per thread. For example, if two threads call qsrand(1) and subsequently calls qrand(), the threads will get the same random number sequence.

This function was introduced in Qt 4.2.

See also qrand().


>>Что означает %?
деление по модулю (то есть остаток от деления)


>>Почему size?
метод такой у вектора - количество элементов в нём
Dimix Дата 2.12.2010, 19:07
 
Цитата(512es @ 2.12.2010, 18:35) *

Понятно без документации и книги дальше мне не шагнуть. Спасибо :clapping: буду листать Макса Шлее.
512es Дата 2.12.2010, 18:35
  http://doc.crossplatform.ru/qt/4.3.2/containers.html
Dimix Дата 2.12.2010, 17:47
 
Цитата
Как задать чтоб вывести к примеру 5 произвольных символов?

С этим вопросом разобрался.
QString ad;
         char randomChar;
         for(int i=0; i=5; ++i){
         randomChar=v[random()%v.size()];
         ad=ad+randomChar;
         };

Только оно почемуто не работает. :unsure:
qrand() - выводит только квадраты;
random() rand() - выводит квадраты и заданый диапазон.

И появились новые вопросы что значит %v.size() Почему size?
Как сделать чтобы оно выводило только Верхний, Нижний регистры латинского алфавита и цыфры?
Отладчик показывает что получено 122 строки с 1 по 60 значение '?', ascii=0
Dimix Дата 2.12.2010, 15:23
 
Цитата(Алексей1153 @ 2.12.2010, 15:03) *
std::vector<char> v('Z'-'A'+1 + 'z'-'a'+1+ '9'-'1'+1,0);

for(char c='A'; c<='Z';c++) v.push_back(c);
for(char c='a'; c<='z';c++) v.push_back(c);
for(char c='1'; c<='9';c++) v.push_back(c);

char randomChar=v[qrand()%v.size()];

Ого вопрос оказывается не настолько прост. :blink: Я почти ничего не понял из выше приведенного кода.
Что такое std::vector?
Почему диапазон задается задом на пред?
Почему +1+ между диапазонами и что значит 0 в конце?
Почему qrand()?
Что означает %?
Как задать чтоб вывести к примеру 5 произвольных символов?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.4.2024, 23:38