Форум программистов, компьютерный форум CyberForum.ru

Функция, которая определяет, входит ли значение в массив - оценка реализации - C++

Восстановить пароль Регистрация
 
 
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
20.07.2014, 19:56     Функция, которая определяет, входит ли значение в массив - оценка реализации #1
привет всем, это снова я велосипедописатель на сей раз я решил опять заюзать так понравившееся мне шаблоны для написания на сей раз более простой, но довольно полезной (на мой взгляд) функции которая определяет входит ли значение в массив, прошу вашей оценки, так ли все хорошо как мне кажется?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <typename T>
bool ValueInArray(T Value, T* Array)
{
    int count = 0;
    bool retval = false;
    while (*Array)
    {
        count++;
        if (Value == *(Array++))
        {
            retval = true;
            break;
        }
        else
        {
            retval = false;
        }
    }
    Array -= count * sizeof(T);
    return retval;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2014, 19:56     Функция, которая определяет, входит ли значение в массив - оценка реализации
Посмотрите здесь:

C++ Функция, которая находит минимальное значение
C++ Написать программу, которая определяет симметричный массив или нет
C++ Функция,которая определяет, встречается ли заданная буква, которая передается в функцию как параметр
C++ Функция, которая для одного целого числа определяет, является ли оно кратно числу К
Функция, которая возвращает требуемое значение C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
20.07.2014, 20:03     Функция, которая определяет, входит ли значение в массив - оценка реализации #2
много лишних телодвижений
вот прямо с твоей проги, просто уменьшил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename T>
bool ValueInArray(T Value, T* Array)
{
  T* ArrayTmp=Array;
    while (*ArrayTmp)
    {
     if (Value == *(ArrayTmp++))
        {
           return  true;
         }
     
    }
     return false;
}
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
20.07.2014, 20:04     Функция, которая определяет, входит ли значение в массив - оценка реализации #3
GetHelp, не работает. Подробно расписывать мне сейчас лень.
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
30
#include <iostream>
 
template <typename T>
bool ValueInArray(T Value, T* Array)
{
    int count = 0;
    bool retval = false;
    while (*Array)
    {
        count++;
        if (Value == *(Array++))
        {
            retval = true;
            break;
        }
        else
        {
            retval = false;
        }
    }
    Array -= count * sizeof(T);
    return retval;
}
 
int main()
{
    int arr[] = {1, 0, 2, 3, 4};
    std::cout << ValueInArray(2, arr) << std::endl; 
    return 0;
}
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
20.07.2014, 20:07     Функция, которая определяет, входит ли значение в массив - оценка реализации #4
0x10,
а не работает потому что он не указал одну маленькую детальку
признак окончания массива 0, как в строке
Цитата Сообщение от GetHelp Посмотреть сообщение
while (*Array)
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
20.07.2014, 20:10     Функция, которая определяет, входит ли значение в массив - оценка реализации #5
ValeryS, вижу, потому и написал такой пример. Я не вижу причин, по которым такая функция должна предъявлять такие требования к контейнеру. Как и не вижу причин, по которым она должна уметь работать с массивом, но не в состоянии обработать вектор.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
20.07.2014, 20:10  [ТС]     Функция, которая определяет, входит ли значение в массив - оценка реализации #6
Цитата Сообщение от ValeryS Посмотреть сообщение
много лишних телодвижений
вот прямо с твоей проги, просто уменьшил
бесспорно вы правы, че то перемудрил... спс
Цитата Сообщение от 0x10 Посмотреть сообщение
GetHelp, не работает. Подробно расписывать мне сейчас лень.
странно а у меня работает...
Цитата Сообщение от ValeryS Посмотреть сообщение
0x10,
а не работает потому что он не указал одну маленькую детальку
символ окончания массива 0, как в строке
эмм не понял о чем вы? тут как бы проверка пока не NULL
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
20.07.2014, 20:16     Функция, которая определяет, входит ли значение в массив - оценка реализации #7
Цитата Сообщение от GetHelp Посмотреть сообщение
эмм не понял о чем вы? тут как бы проверка пока не NULL
ну а теперь посмотри на массив
Цитата Сообщение от 0x10 Посмотреть сообщение
int arr[] = {1, 0, 2, 3, 4};
все он дальше второго элемента не пойдет
Цитата Сообщение от 0x10 Посмотреть сообщение
вижу, потому и написал такой пример.
Вижу, что видишь
Автор не видит

Добавлено через 4 минуты
чтобы перебирал весь массив, не зависимо от элементов нужно явно передавать размер
что то типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename T>
bool ValueInArray(T Value, T* Array, size_t sz)
{
for(size_t i=0;i<sz;i++)
 {
 if(Array[i]==Value)
  {
   return true;
  }
 
 }
return false;
}
ну и вызывать как то так

C++
1
ValueInArray(2,arr,sizeof(arr)/sizeof(arr[0]));
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
20.07.2014, 20:18  [ТС]     Функция, которая определяет, входит ли значение в массив - оценка реализации #8
ValeryS, аа ясно... а нельзя все таки как то без передачи размера массива? не хочу лишние параметры... а если сравнивать скажем с nullptr?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
20.07.2014, 20:23     Функция, которая определяет, входит ли значение в массив - оценка реализации #9
Цитата Сообщение от GetHelp Посмотреть сообщение
а нельзя все таки как то без передачи размера массива?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
template <class Iterator, class T>
bool ValueInArray(Iterator first, Iterator last, const T& value) {
    while (first != last) {
        if (*first == value) {
            return true;
        }
        ++first;
    }
    
    return false;
}
 
int main() {
    int arr[] = {1, 0, 2, 3, 4};
    std::cout << ValueInArray(arr, arr + sizeof(arr) / sizeof(*arr), 4) << std::endl; 
    return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
20.07.2014, 20:24     Функция, которая определяет, входит ли значение в массив - оценка реализации #10
Цитата Сообщение от GetHelp Посмотреть сообщение
не хочу лишние параметры... а если сравнивать скажем с nullptr?
- для динамического массива штука sizeof(Arr)/sizeof(Arr[0]) не сработает будет 4 / sizeof(Arr[0]) всегда(т.к будет делиться размер поинтера на размер нулевого элемента). По поводу кода, я не смог понять зачем он?Если так хочется использовать шаблоны - напиши свой вектор, вот там да будет идти параметром всего один объект.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
20.07.2014, 20:29     Функция, которая определяет, входит ли значение в массив - оценка реализации #11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
для динамического массива штука sizeof(Arr)/sizeof(Arr[0]) не сработает будет 4 / sizeof(Arr[0])
а у динамического массива размер известен иначе как будешь создавать

-=ЮрА=-, приветствую давно не виделись
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
20.07.2014, 20:31  [ТС]     Функция, которая определяет, входит ли значение в массив - оценка реализации #12
0x10, чет не понял че вы делаете, но выглядит еще более громоздко...
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
По поводу кода, я не смог понять зачем он?Если так хочется использовать шаблоны - напиши свой вектор, вот там да будет идти параметром всего один объект.
честно говоря мне уже сто раз попадались ситуации когда такая штука была бы очень кстати... я просто изначально изучал делфи довольно долго и теперь в си мне все время не хватает его функционала вот и пытаюсь изобретать по своему...
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
20.07.2014, 20:31     Функция, которая определяет, входит ли значение в массив - оценка реализации #13
Цитата Сообщение от GetHelp Посмотреть сообщение
а нельзя все таки как то без передачи размера массива?
можно 0x10, показал один из вариантов
но в любом случае нужен какой то параметр, иначе как функция будет узнавать что достигла конца массива?
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
20.07.2014, 20:32  [ТС]     Функция, которая определяет, входит ли значение в массив - оценка реализации #14
Цитата Сообщение от ValeryS Посмотреть сообщение
иначе как функция будет узнавать что достигла конца массива?
Цитата Сообщение от GetHelp Посмотреть сообщение
а если сравнивать скажем с nullptr?
не?
-=ЮрА=-
Заблокирован
Автор FAQ
20.07.2014, 20:38     Функция, которая определяет, входит ли значение в массив - оценка реализации #15
Цитата Сообщение от GetHelp Посмотреть сообщение
а если сравнивать скажем с nullptr?
- не будет нулпоинтера, при достижении конца массива за его пределами будет мусор(не нулевой)
Цитата Сообщение от GetHelp Посмотреть сообщение
честно говоря мне уже сто раз попадались ситуации когда такая штука была бы очень кстати
- ну так напиши, как раз и уровень повысишь и разберёшся получше с шаблонами(даже на форуме полно примеров)

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
-=ЮрА=-, приветствую давно не виделись
- да давно не пересекались в ветках, я тоже рад

ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
20.07.2014, 20:41     Функция, которая определяет, входит ли значение в массив - оценка реализации #16
Цитата Сообщение от GetHelp Посмотреть сообщение
вот и пытаюсь изобретать по своему...
найди какую нибудь книжку
например
А. Фридман, Л. Кландер, М. Михаелес, Х. Шилдт " C/C++ алгоритмы и приемы програмирования"

а то будет как у О. Бендера
Слушайте, что я накропал вчера ночью при колеблющемся свете электрической лампы: «Я помню чудное мгновенье, передо мной явилась ты, как мимолетное виденье, как гений чистой красоты». Правда, хорошо? Талантливо? И только на рассвете, когда дописаны были последние строки, я вспомнил, что этот стих уже написал А. Пушкин. Такой удар со стороны классика! А?
(с) "Золотой теленок" И. Ильф, Е. Петров
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
20.07.2014, 20:45  [ТС]     Функция, которая определяет, входит ли значение в массив - оценка реализации #17
да печалька лажа вышла с передачей размера это уже не комильфо... ладно буду изобретать че нибудь еще
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
20.07.2014, 20:48     Функция, которая определяет, входит ли значение в массив - оценка реализации #18
Цитата Сообщение от GetHelp Посмотреть сообщение
ладно буду изобретать че нибудь еще
Все украдено до нас. Передача итераторов на начало и конец - универсальный способ, повсеместно использующийся в стандартной библиотеке. Позволяет работать как с обычными массивами, так и с контейнерами stl и любыми итераторами, поддерживающих соответствующий интерфейс. Пример я приводил на предыдущей странице.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
20.07.2014, 22:07  [ТС]     Функция, которая определяет, входит ли значение в массив - оценка реализации #19
немного не в тему, но я тут думал по поводу нахождения длины динамического массива и мне стало интересно, а как работает функция realloc? она что выделяет требуемое количество блоков памяти после окончания массива? т.е. вот например был массив на 5 элементов, заюзали realloc с параметром 10 (ну соответственно умножив на sizeof), и она взяла и начиная с конца массива взяла требуемое количество байт и выделила? (кстати так в чем же вообще состоит выделение никак не могу понять?), т.е. в таком случае она должна была как то найти этот самый конец массива, чтобы после него выделить еще сколько то байт... или же она просто выделяет заново 10 элементов, а предыдущий массив об-free-вает? если так то проехали это был проблеск надежды но походу как сказал 0x10 все украдено до нас
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2014, 22:13     Функция, которая определяет, входит ли значение в массив - оценка реализации
Еще ссылки по теме:

Функция, которая возвращает значение в классе C++
C++ Написать программу, которая определяет, содержит ли заданный массив число, равное S
C++ Программа, которая определяет, какую следует удалить цифру из числа, чтобы получить максимальное значение

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
20.07.2014, 22:13     Функция, которая определяет, входит ли значение в массив - оценка реализации #20
Цитата Сообщение от GetHelp Посмотреть сообщение
она что выделяет требуемое количество блоков памяти после окончания массива? т.е. вот например был массив на 5 элементов, заюзали realloc с параметром 10 (ну соответственно умножив на sizeof), и она взяла и начиная с конца массива взяла требуемое количество байт и выделила?
нет она просто выделит в свободном месте нужное количество памяти скопирует туда из старого блока значения и удалит старую память
примерно так

C
1
2
3
4
arr=malloc();
memcpy(arr,arrOld, size);
free(arrOld);
arrOld=arr;
потому она такая и медленная
Yandex
Объявления
20.07.2014, 22:13     Функция, которая определяет, входит ли значение в массив - оценка реализации
Ответ Создать тему
Опции темы

Текущее время: 00:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru