Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
Сыроежка
Заблокирован
#1

Реализация алгоритма find_firdt_not_of через другие алгоритмы - C++

31.07.2011, 18:44. Просмотров 2595. Ответов 55
Метки нет (Все метки)

Хотел создать эту тему в разделе С/С++ для экспертов, но мне было отказано в виду отсутствия неких прав. Поэтому формулирую тему здесь.

Есть стандартный алгоритм std::find_first_of. Но нет стандартного алгоритма std::find_first_not_of. Надо предполагать, что авторы стандарта его не включили по тем соображениям, что его легко реализовать с помощью других алгоритмов.
Поэтому меня интересует, как реализовать данный алгоритм с помощью других алгоритмов? Есть какие-нибудь соображения? Или же на самом деле все сводится к тому, что надо писать собственную оригинальную реализацию этого алгоритма.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2011, 18:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализация алгоритма find_firdt_not_of через другие алгоритмы (C++):

Алгоритмы поиска. Подскажите, в чем суть алгоритма? - C++
нужно написать алгоритм поиска прямым методом (С.Чарас), а я понятия не имею, что это за метод и в и-нэте найти не могу(

Циклические алгоритмы. Реализация рядов - C++
Всем привет. Задали контрольную, есть задание: вывести на экран таблицу значений функции y(x) для х, изменяющегося от 0.1 до 1.2 с шагом...

Реализация алгоритма - C++
Смотрите, есть функция для рисования сегмента круга: pieslice(int x, int y, int start, int end, int radius) - int start и int ende угол...

Реализация алгоритма - C++
помогите пожалуйсто написать программу: 1. Реализовать алгоритм Insertion-Sort (сортировка вставками) и Merge-Sort (сортировка слиянием)...

Реализация алгоритма Прима - C++
Алгоритм Прима?кто может написать?

Реализация алгоритма Мандельброта - C++
Знаю, этим уже давно никого не удивить, но я еще раз решил почтить память Бенуа Мандельброта простой коонсльной программой с реализацией...

55
LosAngeles
Заблокирован
31.07.2011, 20:18 #16
сделай == не членом класса, тогда вроде будет комутативность

Добавлено через 3 минуты
Цитата Сообщение от Сыроежка Посмотреть сообщение
Векторы, как и массивы, имеют итераторы произвольного доступа. Но если вы, например, имеете дело с односвязным списком, то код не будет компилироваться, так как у односвязных списков лишь последовательный итератор.
мне не надо повторять два раза, мне не надо повторять два раза... Я тебе ещё раз повторяю добавь две строки кода и всё будет в шоколаде в том примере
0
Сыроежка
Заблокирован
31.07.2011, 20:19  [ТС] #17
Цитата Сообщение от LosAngeles Посмотреть сообщение
сделай == не членом класса, тогда вроде будет комутативность
Так я специально не хочу этого делать! То есть я не хочу ограничивать множество типов объектов, для которых алгоритм работоспособен. Ситуация становится более понятной, если написать вариант этого алгоритма, который использует не оператор сравнения, а некоторый предикат. Для предикатов очевидно, что совсем не обязательно, что pred( a, b ) выдает тот же самы результат, что и предикат pred( b, a ).
0
LosAngeles
Заблокирован
31.07.2011, 20:24 #18
Цитата Сообщение от Сыроежка Посмотреть сообщение
Так я специально не хочу этого делать! То есть я не хочу ограничивать множество типов объектов, для которых алгоритм работоспособен
как это множество ограничивается от того что == перестаёт быть членом класса?
0
Сыроежка
Заблокирован
31.07.2011, 20:27  [ТС] #19
Цитата Сообщение от LosAngeles Посмотреть сообщение
как это множество ограничивается от того что == перестаёт быть членом класса?
Может быть я не так вас понял. Вопрос же не в том, является оператор членорм класса или нет, а в том, позволяете ли вы коммутативность операции сравнения объектов разного типа : Int и int. Ежели вы просто сделаете оператор не членом класса, то ничего не изменится, так как конструктор имеет спецификатор explicit.
0
easybudda
Модератор
Эксперт CЭксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
31.07.2011, 20:30 #20
Цитата Сообщение от Сыроежка Посмотреть сообщение
Дело в том, что если у меня, допустим, определен такой класс
По-моему он у Вас не до конца доделан... А стандартные контейнеры/алгоритмы с ним работают? В общем случае если a = b, то b = a. Если это не так - "определённо не всё в порядке"(с)... Да и вариант с предиктатом написать никто не запрещает...
0
Сыроежка
Заблокирован
31.07.2011, 20:33  [ТС] #21
Цитата Сообщение от easybudda Посмотреть сообщение
По-моему он у Вас не до конца доделан... А стандартные контейнеры/алгоритмы с ним работают? В общем случае если a = b, то b = a. Если это не так - "определённо не всё в порядке"(с)... Да и вариант с предиктатом написать никто не запрещает...
Это верно, если a и b одного типа! А что делать, если у вас, как в моем примере, происходит сравнение разных типов. Например, у вас есть база данных сотрудников, и ваш класс позволяет лишь отвечать на вопрос: данный сотрудник имеет заданный номенклатурный номер или нет. То есть нет коммутативности. И как я уже сказал, а что делать с предикатами?! Ведь для предикатов, которые задаются пользователями, совершенно не обязательно, что pred( a, b ) == pred( b, a )
0
Kastaneda
31.07.2011, 20:36
  #22

Не по теме:

Мне вот просто интересно, как так получилось, что человек работает с STL, а свою реализацию простого алгоритма написать не может?

0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
31.07.2011, 20:36 #23
Монстрик на основе кода easybudda. Конечно, проблема сохранилась и здесь, но функтор можно переписать через цикл и поставить v с нужной стороны (слева). Но согласен, что не всё в порядке в королевстве датском
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
31
32
33
34
35
36
37
#include <iostream>
#include <algorithm>
 
template <typename ForwardIter>
class NotIn
{
    ForwardIter b;
    ForwardIter e;
public:
    NotIn(ForwardIter start, ForwardIter stop) :
        b(start), e(stop)
    {}
    template <typename T>
    bool operator() (T const& v)
    {
        return std::find(b, e, v) == e;
    }
};
 
template <typename ForwardIter1, typename ForwardIter2>
ForwardIter1 find_first_not_of(ForwardIter1 start1, ForwardIter1 stop1, ForwardIter2 start2, ForwardIter2 stop2){
        return std::find_if(start1, stop1, NotIn<ForwardIter2>(start2, stop2));
}
 
int main(void){
        const int SIZE = 5;
        int arr1[SIZE] = { 1, 2, 3, 6, 5 };
        int arr2[SIZE] = { 1, 2, 3, 4, 5 };
        int * ptr;
        
        if ( ( ptr = (int*)find_first_not_of(arr1, arr1 + SIZE, arr2, arr2 + SIZE) ) == arr1 + SIZE )
                std::cout << "all elements from arr1 found in arr2" << std::endl;
        else 
                std::cout << "First element from arr1 that not found in arr2 is " << *ptr << std::endl;
        
        return 0;
}
0
diagon
31.07.2011, 20:37
  #24

Не по теме:

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

Не по теме:

Мне вот просто интересно, как так получилось, что человек работает с STL, а свою реализацию простого алгоритма написать не может?

А что с ней работать, она интуитивно понятная =)
О алгоритмах такое сказать сложнее.

0
Kastaneda
31.07.2011, 20:40
  #25

Не по теме:

Цитата Сообщение от diagon Посмотреть сообщение
А что с ней работать, она интуитивно понятная =)
Просто когда доходишь до STL, то, как правило, подобные вещь уже должны "от зубов отскакивать"

0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
31.07.2011, 20:41 #26
А интересно, find_first_of даёт какие-либо гарантии по поводу того, что версия без предиката вызовет == с правильной расстановкой аргументов?
0
LosAngeles
Заблокирован
31.07.2011, 20:42 #27
Цитата Сообщение от Сыроежка Посмотреть сообщение
Ежели вы просто сделаете оператор не членом класса, то ничего не изменится, так как конструктор имеет спецификатор explicit
тут всё просто - убери explicit, зачем он нужен в подобном классе? сам себе геморой создаёшь
0
easybudda
Модератор
Эксперт CЭксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
31.07.2011, 20:46 #28
Сыроежка, а не вариант в класс добавить
C++
1
bool operator == ( int a, const Int & b) { return a == b.x; }
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
31.07.2011, 20:51 #29
easybudda, как друга?

Добавлено через 1 минуту
по-моему лучше вне класса объявить такую:
C++
1
2
inline
bool operator == ( int a, const Int & b) { return b == a; }
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
31.07.2011, 20:52 #30
Цитата Сообщение от grizlik78 Посмотреть сообщение
А интересно, find_first_of даёт какие-либо гарантии по поводу того, что версия без предиката вызовет == с правильной расстановкой аргументов?
Returns: The first iterator i in the range [first1, last1) such that for some integer j in the range
[first2, last2) the following conditions hold: *i == *j, pred(*i,*j) != false.
Returns last1 if no such iterator is found.
в стандарте все четко
1
31.07.2011, 20:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2011, 20:52
Привет! Вот еще темы с ответами:

Реализация волнового алгоритма - C++
Делаю игру Пакман В Игре имеются следующие классы Map.h #ifndef MAP_H #define MAP_H #include &lt;SFML\Graphics.hpp&gt;

Реализация Алгоритма Грэхема на С++ - C++
Доброго времени суток, пожалуйста помогите разобраться с написанием программы. Что непонятно: 1) Каким образом вводятся точки? В...

Реализация алгоритма FOREL - C++
Не буду слишком наглым и не буду просить готовое решение, но вопросы будут на каждом шагу! для начала, не сильно раньше заморачивался,...

Реализация LCS алгоритма на с++ - C++
Здравствуйте форумчане!! Помогите заблудшей душе.... Есть задачка , максимально быстрым способом найти наибольшую общую подстроку во...


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

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

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