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

Помогите разобраться с итераторами - C++

Восстановить пароль Регистрация
 
myltdne
2 / 2 / 1
Регистрация: 23.04.2011
Сообщений: 39
12.01.2012, 20:28     Помогите разобраться с итераторами #1
У меня есть шаблон класса контейнер.
Я использую vector из stl. Так вот мне нужен итератор для поиска find ( first, last, value ) но компилятор очень много ошибок выдает, помогите пожалуйста

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
#include <algorithm>
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <fstream>
 
template<typename T>
class ComputerModel
{
private:
    vector<T> container;
    vector<T>::const_iterator it; // тут пишет missing type specifier - int assumed
        const_iterator begin() const //аналогично
        {
            return container.begin();
        }
    const_iterator end() const //аналогично
        {
            return container.end();
        }
 
        void Find( const_iterator it, const_iterator it, int search_for); // функция поиска..
}
а это сам шаблон поиска

C++
1
2
3
4
5
6
template<typename T>
void ComputerModel<T>::Find(const_iterator it, const_iterator it, int search_for) // тут пишет //ComputerModel<T>::Find' : looks like a function definition, but there is no parameter list;
{
    //---------
        ...........
}
я потом использую эти итераторы, подставляю туда вектор.бегин и вектор.энд.. а тут столько ошибок... как правильно в моем случае их определять?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2012, 20:28     Помогите разобраться с итераторами
Посмотрите здесь:

итераторами для std::set C++
C++ Помогите разобраться
Действие с итераторами C++
C++ Работа с итераторами
C++ Работа с Итераторами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
12.01.2012, 21:08     Помогите разобраться с итераторами #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
template<typename T>
class ComputerModel
{
private:
        std::vector<T> container;
 
public:
        typedef typename std::vector<T>::const_iterator const_iterator;
 
public:
        const_iterator begin() const 
        {
            return container.begin();
        }
 
        const_iterator end() const 
        {
            return container.end();
        }
 
 
 
        void Find(const_iterator first, const_iterator last, const T& search_for) const;
};
C++
1
2
3
4
5
6
template<typename T>
void ComputerModel<T>::Find(const_iterator first, const_iterator last, const T& search_for) const
{
    //---------
    ...........
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.01.2012, 21:08     Помогите разобраться с итераторами #3
вот попробуйте у себя такой пример. потом из него перетащите к себе в проект все, что потребуется

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
38
#include <vector>
 
template<typename T>
class ComputerModel
{
public:
  typedef std::vector<T> Container;
  typedef typename Container::const_iterator ConstIter;
 
private:
  Container container;
  ConstIter it;
 
public:
  ConstIter begin() const
  {
    return container.begin();
  }
 
  ConstIter end() const
  {
    return container.end();
  }
 
  void Find(ConstIter begin, ConstIter end, int search_for) const;
};
 
template <typename T>
void ComputerModel<T>::Find(ConstIter begin, ConstIter end, int search_for) const
{
}
 
int main()
{
  ComputerModel<int> cm;
  cm.Find(cm.begin(), cm.end(), 0);
  return 0;
}
хех, это почти то же самое, что сверху написали.
myltdne
2 / 2 / 1
Регистрация: 23.04.2011
Сообщений: 39
12.01.2012, 22:02  [ТС]     Помогите разобраться с итераторами #4
Все заработало) Спасибо огромное) Только теперь еще один вопрос.
Реализация Файнда.

У меня в контейнере хранятся объекты следующей структуры

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
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;
 
    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) 
        : code (_code), brand (_brand), cpu_type (_cpu_type), 
        cpu_frequency (_cpu_frequency), ram (_ram), hard_drive_memory (_hard_drive_memory), videocard_memory (_videocard_memory),
        price (_price), available_copies (_available_copies)
    { }
 
    HardWare()
    { }
 
void Print()
    {
        cout << "-------------------------------------------------------------------------------" << endl;
        cout << "Computer code:\t\t"  << code << endl;
        cout << "Computer brand name:\t"  << brand << endl;
        cout << "CPU type:\t\t"  << cpu_type << endl;
        cout << "CPU frequency:\t\t"  << cpu_frequency << endl;
        cout << "RAM:\t\t\t"  << ram << endl;
        cout << "Hard drive:\t\t"  << hard_drive_memory << endl;
        cout << "Videocard:\t\t"  << videocard_memory << endl << endl;
        cout << "Computer price:\t\t"  << "$" << price << endl;
        cout << "Available copies:\t"  << available_copies << endl;
        cout << "-------------------------------------------------------------------------------" << endl;
    }
}
То есть ComputerModel<HardWare> obj;

Допустим я ищу по какому-то критерию, например RAM

Find(obj.begin(), obj.end(), string value) -> идем в шаблон, перебераем итераторы в цикле

C++
1
2
3
4
5
for ( begin; begin!=end; begin++)
{
    if(/*а вот здесь как? не могу же я написать вот так потому что это итератор*/ *begin.ram == value)
        *begin.Print();
}
Блин( я уже запутался совсем(
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.01.2012, 00:17     Помогите разобраться с итераторами #5
как-то криво у вас это сделано. файнд ничего не возвращает. хотя мог бы возвращать итератор. и дальше уже в зависимости от ситуации, можно было бы результат печатать или еще что-то делать. вариант принта в файнде как сейчас - это хардкод и ничего хорошего из этого не будет. Это первое.

Второе. Как сделать так, чтобы поиск был легко настраиваемый? Так же как и в стл работает алгоритм std::find_if, который принимает диапазон поиска и предикат. т.е. файнд можно было бы переписать вот так:

C++
1
2
3
4
5
6
7
8
9
10
template <typename Pred>
const_iterator Find(const_iterator begin, const_iterator end, Pred predicate) const
{
   return std::find_if(begin, end, predicate);
}
 
const_iterator Find(Pred predicate) const // удобно, когда нужен поиск по всему диапазону
{
   return Find(begin(), end(), predicate);
}
Использование:
C++
1
2
3
4
5
ComputerModel<XXX> cm;
if (cm.Find(cm.begin(), cm.end(), SomePred) != cm.end())
{
  // do something
}
И третье. Не совсем понятно в чем польза от класса ComputerModel. Почему нельзя было просто использовать контейнеры и алгоритмы?

Добавлено через 38 минут
Четвертое
C++
1
2
3
4
5
for ( begin; begin!=end; begin++)
{
    if(/*а вот здесь как? не могу же я написать вот так потому что это итератор*/ *begin.ram == value)
        *begin.Print();
}
Очень даже можете. Итератор можете рассматривать как указатель. Через итератор можно получить доступ до объекта и до его публичных полей\методов.
C++
1
2
3
4
if (begin->ram == value)
{
   ...
}
Итератор можете рассматривать как указатель. Через итератор можно получить доступ до публичных полей\методов объекта, на который этот итератор ссылается.
myltdne
2 / 2 / 1
Регистрация: 23.04.2011
Сообщений: 39
13.01.2012, 20:11  [ТС]     Помогите разобраться с итераторами #6
Цитата Сообщение от DU Посмотреть сообщение
Не совсем понятно в чем польза от класса ComputerModel. Почему нельзя было просто использовать контейнеры и алгоритмы?
Ну я и использую контейнер vector<T> container в котором хранятся объекты HardWare
Yandex
Объявления
13.01.2012, 20:11     Помогите разобраться с итераторами
Ответ Создать тему
Опции темы

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