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

find_if, нужна помощь - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
myltdne
2 / 2 / 1
Регистрация: 23.04.2011
Сообщений: 39
26.01.2012, 17:24     find_if, нужна помощь #1
Здравствуйте!
Помогите решить проблему пожалуйста. Тут все просто, но у меня куча ошибок (

Вот структура

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct HardWare
{
    unsigned int code;
    string brand;
    string cpu_type;
    string cpu_frequency;
    string ram;
    string hard_drive_memory;
    string videocard_memory;
    int price;
    int available_copies;
 
        ........................................
 
}
Дальше шаблон класса

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
template<typename T>
class ComputerModel
{
private:
vector<T> Container;
stack<T> Subset;
 
public:
typedef typename Container::iterator Iter;
ComputerModel();
~ComputerModel();
void Clear();
void Add(const T& value);
Iter begin() const
  {
    return container.begin();
  }
Iter end() const
  {
    return container.end();
  }
bool by_ram_8gb(Iter begin)
  {
      return (begin->ram == "8Gb");
  }
Iter Find(Iter begin, Iter end, bool Iter);
};
Вот сам поиск

C++
1
2
3
4
5
6
template <typename T>
Iter ComputerModel<T>::Find(Iter begin, Iter end, bool comparer)
{
   it = find_if(begin, end, comparer);
   return it;
}
и мэйн

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void main()
{
    bool by_ram_8gb;
    ComputerModel<HardWare> obj;
 
  HardWare computer1(24368, "Acer Predator Trooper", "Intel", "2.83GHz", "8Gb", "150Gb", "512Mb", 1045, 100);
  HardWare computer2(168760, "Everest Home 8030", "Intel", "3.3GHz", "4Gb", "1Tb", "1Gb", 686, 100);
  HardWare computer3(145685, "Brain Top Gamer B70", "Intel", "3.4GHz", "8Gb", "1Tb", "1536Mb", 1630, 100);
  obj.Add(computer1);
  obj.Add(computer2);
  obj.Add(computer3);
  obj.Print();
  obj.Find(obj.begin(), obj.end(), by_ram_8gb);
  
}
Что я не так делаю? Как исправить? Мне надо чтобы работал именно поиск через find_if и искал значение ram к объектах HardWare Помогите пожалуйста (

Вот такие ошибки

скрин ошибок
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2012, 17:24     find_if, нужна помощь
Посмотрите здесь:

С, нужна помощь C++
C++ НУЖНА ПОМОЩЬ В С++
C++ Нужна помощь.
C++ Нужна помощь
Нужна помощь C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
26.01.2012, 19:23     find_if, нужна помощь #2
find_if, очевидно, принимает не какое-то не пойми к чему относящееся значение типа bool. А принимает он сравниватель - некое выражение (функцию или объект с оператором круглых скобок, в C++11 можно лямбда-функцию), которое принимает на входе значение, содержащееся в контейнере (а не итератор). На выходе сравниватель для каждого предъявленного выражения уже выдаёт bool - то это, что мы ищем, или нет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool Comparer1(const HardWare &h)  // Вариант 1 - функция
{
    return h.ram == "8Gb";
}
class Comparer2 {  // Вариант 2 - объект-сравниватель
public:
    Comparer2(const std::string& crit): criterion(crit) {}
    bool operator () (const HardWare &h) const {return h.ram == criterion;}
private:
    const string criterion;
};
 
void foo(ComputerModel<HardWare> &obj)
{
    obj.Find(obj.begin(), obj.end(), Comparer1);  // Функцией
    obj.Find(obj.begin(), obj.end(), Comparer2("8Gb"));  // Объектом
    obj.Find(obj.begin(), obj.end(), [](const HardWare& h) {return h.ram == "8Gb";});  // Лямбдой
}
myltdne
2 / 2 / 1
Регистрация: 23.04.2011
Сообщений: 39
26.01.2012, 20:45  [ТС]     find_if, нужна помощь #3
Написал вот так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool Comparer1(const HardWare &h)  // Вариант 1 - функция
{
    return h.ram == "8Gb";
}
 
void Find(Iter begin, Iter end, bool Comparer1);
 
template <typename T>
void ComputerModel<T>::Find(Iter begin, Iter end, bool Comparer1)
{
auto   it = find_if(begin, end, Comparer1);
cout << *it << endl;
   //return it;
}
но теперь пишет такую ошибку

C++
1
2
3
4
5
6
7
8
9
10
11
12
Error   1   error C2064: term does not evaluate to a function taking 1 arguments    c:\program files\microsoft visual studio 10.0\vc\include\algorithm  83  1   cyberforum
 
        // TEMPLATE FUNCTION find_if
template<class _InIt,
    class _Pr> inline
    _InIt _Find_if(_InIt _First, _InIt _Last, _Pr _Pred)
    {   // find first satisfying _Pred
    for (; _First != _Last; ++_First)
        if (_Pred(*_First)) // -- и сюда указывает
            break;
    return (_First);
    }
Что это значит?? что не так?

Добавлено через 17 минут
ALILUYA!!!!!!! spasibo zarabotalo ) поменял имя параметра в файд с Comparer1 на comp и уряяяя!!! )
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
26.01.2012, 21:01     find_if, нужна помощь #4
ну да. только теперь поиск будет с одним компарером, который вы захардкодили и другое компарер вы в такую ф-ию не передадите.
непонятно, какой смысл делать такую ф-ию методом класса, если она ни один мембер этого класса не использует. Все параметры ей передаются извне. Т.е. это кандидат на свободную ф-ию.
А зачем такую функцию вообще писать, если она почти полностью повторяет std::find_if? Если нужна печать найденного объекта, то только в этом случае можно оправдать ее существование. Но даже ф-ия файнд с печатью это тоже глюк. Правда уже более высокого уровня, глюк дизайна этой ф-ии, она делает больше чем одно действие. Поиск и печать результата.
Yandex
Объявления
26.01.2012, 21:01     find_if, нужна помощь
Ответ Создать тему
Опции темы

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