Заблокирован
|
|
1 | |
Реализация алгоритма find_firdt_not_of через другие алгоритмы31.07.2011, 18:44. Показов 4445. Ответов 55
Метки нет (Все метки)
Хотел создать эту тему в разделе С/С++ для экспертов, но мне было отказано в виду отсутствия неких прав. Поэтому формулирую тему здесь.
Есть стандартный алгоритм std::find_first_of. Но нет стандартного алгоритма std::find_first_not_of. Надо предполагать, что авторы стандарта его не включили по тем соображениям, что его легко реализовать с помощью других алгоритмов. Поэтому меня интересует, как реализовать данный алгоритм с помощью других алгоритмов? Есть какие-нибудь соображения? Или же на самом деле все сводится к тому, что надо писать собственную оригинальную реализацию этого алгоритма.
0
|
31.07.2011, 18:44 | |
Ответы с готовыми решениями:
55
Алгоритмы поиска. Подскажите, в чем суть алгоритма? Для одномерного массива составить блок схему алгоритма - Алгоритмы Циклические алгоритмы. Реализация рядов Реализация наложений изображений, масок на другие изображения. |
31.07.2011, 18:53 | 2 |
один из вариантов:
если коллекция пуста, возвращаем ::npos ищем "первый один из" если не нашли, или нашли, и оно непервое, то возвращаем первый элемент если нашли, и он первый, то повторяем все для всей коллекции, исключая первый элемент.
1
|
Заблокирован
|
|
31.07.2011, 18:56 [ТС] | 3 |
Я не понял, причем здесь npos?! Алгоритм find_first_not_of должен иметь точно такое же объявление, как и алгоритм find_first_of, И возвращать итератор найденного элемента коллекции или итератор конца интервала.
Вы наверное путаете с алгоритмами для класса std::string. Я же имею в виду стандартный алгоритм, а не алгоритмы какого-нибудь класса.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||||
31.07.2011, 19:01 | 5 | |||||
перефразируя пример с cplusplus.com
0
|
Заблокирован
|
|
31.07.2011, 19:02 [ТС] | 6 |
Дело в том, что вы пытаетесь создать оригинальную реализацию алгоритма. Меня же интересует, можно ли как-нибудь исхитриться и получить данный алгоритм на основе существующих алгоритмов. То есть я хочу понять, почему этот алгоритм не включен в список стандартных алгоритмов. Одна из возможных причин, что его, якобы, легко реализовать через другие алгоритмы. Действительно это так или нет?
0
|
Заблокирован
|
|
31.07.2011, 19:11 [ТС] | 8 |
alex_x_x
Если я не ошибаюсь, то ваш алгоритм не работает, так как он сравнивает элемент коллекции не со всеми элементами заданного набора. То есть если у вас первый элемент коллекции 'a', а заданный набор не совпадений равен "ABCa", то у вас уже при сравнении 'a' с 'A" ваш предикат вернет значение true, хотя на самом деле 'a' совпадает с 'a' из набора несовпадений. Добавлено через 1 минуту Покажите, как это сделать? Уже приведенный один вариант, как мне представляется на глазок, является неверным.
0
|
Заблокирован
|
||||||
31.07.2011, 19:43 [ТС] | 10 | |||||
Я вам не только пример, но и прототип алгоритма напишу
int a[] = { 1, 2, 3, 3, 1, 4, 2 }; и вектор std::vector<int> v( a, a + 3 ); то вам нужно найти в массиве 'a' первый элемент, который не содержится в векторе 'v', точнее сказать, который не равен ни одному элементу вектора 'v'.
0
|
Заблокирован
|
||||||
31.07.2011, 19:49 | 11 | |||||
без помощи других алгоритмов
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
||||||
31.07.2011, 19:50 | 12 | |||||
0
|
Заблокирован
|
|
31.07.2011, 19:57 [ТС] | 13 |
Это конечно хорошо, что вы написали этот алгоритм. Правда он содержит серьезную ошибку, так как у у функции должны быть последовательные итераторы, а не итераторы произвольного доступа. То есть ваш код if (it == last2-1) не верен, так как операция вычитания для последовательного итератора не определена. Кроме того у вас есть и вторая ошибка: вы вместо оператора равенства используете оператор неравенства для сравнения разыменованных значений. Но дело не в этом. Меня интересует: все же можно создать данный алгоритм через использование других алгоритмов, или же это серьезное упущение комитета по стандартизации, что он не включил этот алгоритм в набор стандартных алгоритмов.
0
|
Заблокирован
|
|
31.07.2011, 20:03 | 14 |
я проверял на веторе, думаю не надо показывать, что исправить чтобы работало для других контейнеров?
а насчёт второго я хз, но результат она выдаёт правильный
0
|
Заблокирован
|
|||||||||||
31.07.2011, 20:13 [ТС] | 15 | ||||||||||
Вот это то, что надо! Правда вы включили лишнее определение дополнительного итератора 'i', который совершенно не требуется. То есть можно было написать проще
*start1 == *it2 ( где it2 - это некоторый итератор из диапазона [start2, stop2). В вашем же алгоритме происходит перестановка операндов сравнения, то есть вы сравниваете *it2 == *start1 Дело в том, что если у меня, допустим, определен такой класс, как
То есть я имею в виду, что сравнение Int == int определено, а сравнение int == Int не определено. Добавлено через 4 минуты Векторы, как и массивы, имеют итераторы произвольного доступа. Но если вы, например, имеете дело с односвязным списком, то код не будет компилироваться, так как у односвязных списков лишь последовательный итератор.
0
|
Заблокирован
|
|
31.07.2011, 20:18 | 16 |
сделай == не членом класса, тогда вроде будет комутативность
Добавлено через 3 минуты мне не надо повторять два раза, мне не надо повторять два раза... Я тебе ещё раз повторяю добавь две строки кода и всё будет в шоколаде в том примере
0
|
Заблокирован
|
|
31.07.2011, 20:19 [ТС] | 17 |
Так я специально не хочу этого делать! То есть я не хочу ограничивать множество типов объектов, для которых алгоритм работоспособен. Ситуация становится более понятной, если написать вариант этого алгоритма, который использует не оператор сравнения, а некоторый предикат. Для предикатов очевидно, что совсем не обязательно, что pred( a, b ) выдает тот же самы результат, что и предикат pred( b, a ).
0
|
Заблокирован
|
|
31.07.2011, 20:24 | 18 |
0
|
Заблокирован
|
|
31.07.2011, 20:27 [ТС] | 19 |
Может быть я не так вас понял. Вопрос же не в том, является оператор членорм класса или нет, а в том, позволяете ли вы коммутативность операции сравнения объектов разного типа : Int и int. Ежели вы просто сделаете оператор не членом класса, то ничего не изменится, так как конструктор имеет спецификатор explicit.
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
31.07.2011, 20:30 | 20 |
По-моему он у Вас не до конца доделан... А стандартные контейнеры/алгоритмы с ним работают? В общем случае если a = b, то b = a. Если это не так - "определённо не всё в порядке"(с)... Да и вариант с предиктатом написать никто не запрещает...
0
|
31.07.2011, 20:30 | |
31.07.2011, 20:30 | |
Помогаю со студенческими работами здесь
20
Реализация алгоритма Реализация алгоритма МТ Реализация алгоритма Реализация алгоритма Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |