Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
#1

Как перебрать (UINT_MAX + 1) элемент? - C++

13.05.2017, 20:26. Просмотров 230. Ответов 9

C++
1
2
3
4
5
for(unsigned int b(UINT_MAX); ++b != UINT_MAX;)
 
// или так:
 
for(unsigned int b(0); b != UINT_MAX; ++b)
кому как нравиться, собственно вопрос как написать цикл перебирающий UINT_MAX + 1 элемент, задействовав тип: unsigned int
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2017, 20:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как перебрать (UINT_MAX + 1) элемент? (C++):

Как перебрать числа
Есть три переменные - a, b, c. Надо чтобы на их места по очереди вставали все...

Как перебрать поля структуры?
возможно ли это в с++ ? (c# - GetFields)

Как перебрать все N-значные числа?
нам дают размер массива и надо перебрать все числа, т.е. дают 4: 0000 0001...

Как перебрать все экземпляры класса?
Здравствуйте! Я начинающий программист..... может и не программист вовсе. Но...

Простой парсер - как перебрать варианты строки
Всем привет!Опыт программирования на си++ всего месяц-c# около 4 а делфи один...

Как перебрать одно значение переменной в векторе?
поясню: необходимо посчитать количество букв "f" в слове, которое вводит...

9
GoldenId
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
13.05.2017, 21:24 #2
Лучший ответ Сообщение было отмечено eXPonent как решение

Решение

Здесь тело цикла не выполнится для b == UINT_MAX
C++
1
for(unsigned int b(UINT_MAX); ++b != UINT_MAX;)
C++
1
for(unsigned int b(0); b != UINT_MAX; ++b)
А здесь выполнится
C++
1
2
3
4
unsigned int b = 0;
do
//
while( ++b != 0 );
Добавлено через 46 минут
Хотя, скакать инкрементом через максимум - это, как сказал бы GbaLog, UB.
1
eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
13.05.2017, 22:08  [ТС] #3
1) А через for организовать подобное можно?

2) и ещё вопрос, что быстрее выполниться?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
string S("1234");
 
unsigned int b = 0;
do
{
    for(char c(-1); ++c != S.size(); S[c] = (unsigned char) (l >> c*8) );
}
while( ++b != 0 );
 
//или
 
unsigned char a(0);
unsigned char b(0);
unsigned char c(0);
unsigned char d(0);
do
{
    do
    {
        do
        {
            do
            {
                string S(a+b+c+d);
                unsigned long l = (a << 24) + (b << 16) + (c << 8) + d;
            }while( ++d != 0 );
        }while( ++c != 0 );
    }while( ++b != 0 );
}while( ++a != 0 );
или можно только методом запуска узнать?

Добавлено через 31 минуту
А то иногда узнаешь вот такие вещи:
(о которых даже не догадывался)
Кликните здесь для просмотра всего текста
Цитата Сообщение от eXPonent Посмотреть сообщение
Вызов итераторов настолько затруднен для компилятора?

Воть функция:
C++
1
2
3
4
5
6
7
unsigned long s4(const string &s)
{
    unsigned long s4(0);
    for (string::const_iterator i(s.begin()); i != s.end(); ++i)
        s4 += ( (unsigned char)(*i) << ((i-s.begin())%4*8) );
    return s4;
}
работает долго...
НО так как очень часто поступают строки состоящие из 4 символов можно его заменить эквивалентным:
C++
1
2
3
4
5
6
7
8
9
10
11
12
unsigned long s4(const string &s)
{
    if(s.size() == 4)
        return (unsigned char) s[0] + ((unsigned char) s[1] << 8) + ((unsigned char) s[2] << 16) + ((unsigned char) s[3] << 24);
    else
    {
        unsigned long s4(0);
        for (string::const_iterator i(s.begin()); i != s.end(); ++i)
            s4 += ( (unsigned char)(*i) << ((i-s.begin())%4*8) );
        return s4;
    }   
}

работает в 7 раз быстрее!
Как так то?
0
GoldenId
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 770
Записей в блоге: 14
Завершенные тесты: 1
13.05.2017, 22:14 #4
Ну если он будет каждый раз выделять в стеке строку и освобождать её
C++
1
                string S(a+b+c+d);
это будет большой оверхед, имхо.
Плюс заметьте, что
a+b+c+d != ( (uint32_t)a << 24 ) + ( (uint32_t)b << 16 ) + ( (uint32_t)c << 8 ) + (uint32_t)d;
1
eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
13.05.2017, 22:59  [ТС] #5
хорошо
он не будет освобождать память, символы в строке будут просто переписываться, так пойдет?

Цитата Сообщение от GoldenId Посмотреть сообщение
Плюс заметьте, что
это я понимаю, мне нужно просто сделать
хотя, вы правы, мне не нужно обрабатывать строчку:
C++
1
unsigned long l = (a << 24) + (b << 16) + (c << 8) + d;
а переменные a, b, c, d можно вообще заменить на массив char, для более быстрой работы и обработки данных
ведь нам только нужно помнить всего 4 символа!

т.е. код можно заменить такой конструкцией (вместо string):
C++
1
2
3
4
5
6
7
8
9
10
unsigned int HashLy(const char * str)
{
    unsigned int hash = 0;
 
    for(; *str; ++str)
        hash = (hash * 1664525) + (unsigned char)(*str) + 1013904223;
 
    return hash;
 
}
(ULONG_MAX + 1) * char[4] данных
будет обрабатывать быстрее

(ULONG_MAX + 1) * string("xxxx") данных ведь так?

Добавлено через 19 минут
Цитата Сообщение от eXPonent Посмотреть сообщение
1) А через for организовать подобное можно?
есть for с пост условием?
или только while?

Добавлено через 9 минут
Цитата Сообщение от GoldenId Посмотреть сообщение
Хотя, скакать инкрементом через максимум - это, как сказал бы GbaLog, UB.
Вот что мне писали когда я спрашивал:
Цитата Сообщение от eXPonent Посмотреть сообщение
Насколько безопасна строчка:
Цитата Сообщение от Evg Посмотреть сообщение
Какой смысл ты вкладываешь в слово "безопасны"?
По стандарту именно беззнаковое переполнение вроде бы как определено (т.е. НЕ является undefined behaviour)
0
Captain Maxee
Велосипедист...
320 / 204 / 73
Регистрация: 15.12.2015
Сообщений: 754
Завершенные тесты: 1
14.05.2017, 03:40 #6
Цитата Сообщение от GoldenId Посмотреть сообщение
Хотя, скакать инкрементом через максимум - это, как сказал бы GbaLog, UB.
Не думаю, что он бы так сказал. Поведение при переполнении беззнаковых целых определено. Это не UB.

Добавлено через 1 минуту
Цитата Сообщение от eXPonent Посмотреть сообщение
есть for с пост условием?
или только while?
C++
1
2
3
4
do
{
}
while( <expression> );
1
eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
14.05.2017, 18:11  [ТС] #7
Спасибо, а что по поводу вопроса:
Цитата Сообщение от eXPonent Посмотреть сообщение
(ULONG_MAX + 1) * char[4] данных
будет обрабатывать быстрее
(ULONG_MAX + 1) * string("xxxx") данных ведь так?
А то убрав итератор ускорил функцию в 7 раз
А вообще какой есть быстрый алгоритм перебора элементов в string или char[] ?
0
eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
18.05.2017, 02:22  [ТС] #8
Так же то же сработает перебор всех элементов?
Цитата Сообщение от eXPonent Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
unsigned char a(0);
unsigned char b(0);
unsigned char c(0); 
unsigned char d(0);
do{ do{ do{ do{
// код
}while( ++d ); 
}while( ++c ); 
}while( ++b );
}while( ++a );
зачем делать лишнее сравнение ( != 0 )
0
gru74ik
18.05.2017, 07:09
  #9

Не по теме:

Цитата Сообщение от GoldenId Посмотреть сообщение
это, как сказал бы GbaLog, UB
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Не думаю, что он бы так сказал
Тот момент, когда чувствуешь гордость, что этот чувак у тебя в друзьях

0
GoldenId
18.05.2017, 14:42     Как перебрать (UINT_MAX + 1) элемент?
  #10

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение

Не по теме:



Тот момент, когда чувствуешь гордость, что этот чувак у тебя в друзьях

Для чего мы ещё нужны, как не для массовки?

0
18.05.2017, 14:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2017, 14:42
Привет! Вот еще темы с ответами:

Как в цикле перебрать все элементы отдельного столбца или строки?
Подскажите как такой цикл пробегается по элементам? for (i=1;i&lt;9;i++) ...

Строки. Как найти в слове первый элемент? Второй элемент, последний элемент?
как найти в слове первый элемент?Второй элемент,последний элемент.С помощью...

Как перебрать все элементы в map<string, vector<string>>
Доброго времени суток. Решаю следующую задачу: В файле есть сведения об...

Как добавить элемент в очередь, используя указатель на последний элемент?
Не пойму как добавить элемент в очередь используя указатель на последний...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru