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

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

Войти
Регистрация
Восстановить пароль
 
myltdne
2 / 2 / 1
Регистрация: 23.04.2011
Сообщений: 39
#1

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

12.01.2012, 20:28. Просмотров 748. Ответов 5
Метки нет (Все метки)

У меня есть шаблон класса контейнер.
Я использую 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     Помогите разобраться с итераторами
Посмотрите здесь:

Помогите разобраться с try-catch - C++
#include &lt;iostream.h&gt; int main() { int s = 0; try { int a = 6 / s; } catch(char* exception) {

Помогите новичку разобраться с С++ - C++
Доброго всем времени суток! Пытаюсь изучать С++ и у меня такие вопросы(накопились из разных тем): 1.Когда надо в конце типу float...

Помогите разобраться с switch - C++
Вот код программы: int i_1x; i_1x = 0; char a_n; ifstream input(&quot;input.txt&quot;); input &gt;&gt; a_n; switch...

Помогите разобраться с рекурсией... - C++
Здравствуйте, нашел решение задачи &quot;ханойских башен&quot;, проблема с пониманием. &lt;...&gt; tn(n,1,2,3); &lt;...&gt; void tn(int n,...

Помогите разобраться с циклом while. - C++
Здравствуйте. Уже долго мучаюсь с крестиками-ноликами. Наконец то подошел финал, как вдруг на самом простом запутался. Помогите...

Помогите разобраться с классами в C++ - C++
Есть задание по ООП С++ Используя классы создать кольцо.Записи кольца включают в себя указатели на очередь, содержащую указатели на на...

Помогите разобраться со структурами - C++
Приветствую всех! :) Мне дали очередное задание с которым, конешноже я не могу самостоятельно справиться и именно поэтому вновь прошу вашей...

Помогите разобраться с указателем - C++
помогите новичку разобраться с указателем. не получается реализовать древесную сортировку

Помогите разобраться в коде - C++
Помогите мне разобраться в коде. Заранее спасибо. int seek_substring_KMP (char s, char p) { int i, j, N, M; N = strlen(s); M =...

Помогите разобраться с кодом - C++
Код - проверка ввода данных. Если вводиться &quot;x6x&quot;, то вызывается исключение, правильным вводом являются только символы, например: &quot;xxx&quot;,...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
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
1481 / 1057 / 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
1481 / 1057 / 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     Помогите разобраться с итераторами
Ответ Создать тему
Опции темы

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