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

Проблема с итератором в <vector> - C++

Восстановить пароль Регистрация
 
pun4er
6 / 6 / 1
Регистрация: 06.10.2010
Сообщений: 122
11.01.2012, 16:45     Проблема с итератором в <vector> #1
Всем привет. Помогите пожалуйста решить проблему: У меня существует класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Book
{
    string author,title,publishing;
    int year_p;
    double price;
public:
    Book(){author=title=publishing="";year_p=price=0;}
    Book(string a,string t,int y,string p,double pr)
    {
        author=a;
        title=t;
        year_p=y;
        publishing=p;
        price=pr;
    }
    ~Book(){};
    int delete_book();
    friend ostream& operator<<(ostream& out,Book ob);
    vector<Book>v;
};
полностью код писать не буду, только самое нужное. Так вот. У меня есть вектор v типа <Book>.
Мне в задании нужно произвести поиск. Вот что я делаю
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
int Book::delete_book()
{
    Book ob;
    string a,t,p,x;
    int y,i;
    double pr;
//далее нужно из файла считать данные и засунуть их в вектор
    fstream in("books.txt",ios::out | ios::in | ios::binary);
    while(!in.eof())
    {
        in>>a;
        in>>t;
        in>>y;
        in>>p;
        in>>pr;
        ob.v.push_back(Book(a,t,y,p,pr));
    }
    for(int i=0;i<ob.v.size();i++)
        cout<<ob.v[i];//вектор заполнен, все хорошо
    cout<<"\nВведите название книги: ";
    cin>>x;
    vector<Book>::iterator it;//создаю итератор для поиска
    it=find(ob.v.begin(),ob.v.end(),x);//тут ошибка! описание ниже
 
return 0;
}
возникает ошибка в файле algorythm:
"Ошибка 10 error C2678: бинарный "==": не найден оператор, принимающий левый операнд типа "Book" (или приемлемое преобразование отсутствует) c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm 41
"
Подключены такие библиотеки
C++
1
2
3
4
5
6
7
#include<iostream>
#include<conio.h>
#include<fstream>
#include<vector>
#include<algorithm>
#include<iterator>
#include<string>
Компилятор VC 2010
В чем проблема, скажите пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2012, 16:45     Проблема с итератором в <vector>
Посмотрите здесь:

C++ vector<T> template vector<T>::iterator
C++ Проблема с vector
C++ Проблема с vector
C++ Проблема с <vector>
C++ ошибка с итератором
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.01.2012, 17:00     Проблема с итератором в <vector> #2
не в вектора дело а тем более не в итераторе.
напишите оператор== для вашего класса, вам компиль же ясно даже русским языком об этом и написал
Haster
инженер-системотехник
 Аватар для Haster
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
11.01.2012, 17:00     Проблема с итератором в <vector> #3
pun4er, в твоем случае функция find перебирает элементы типа Book и пытается их сравнивать со строкой... Что не верно.
Как сказал OstapBender, нужно переопределить оператор == :

bool operator==(const Book&, const string&);
bool operator==(const string&, const Book&);
zkod
5 / 5 / 0
Регистрация: 19.09.2009
Сообщений: 23
11.01.2012, 17:09     Проблема с итератором в <vector> #4
Цитата Сообщение от Haster Посмотреть сообщение
pun4er, в твоем случае функция find перебирает элементы типа Book и пытается их сравнивать со строкой... Что не верно.
Соглассен.
Автору нужно написать геттер для получения поля title (название в классе) и сравнивать с ним.
для этого возможно не нужно будет перегружать оператор ==
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.01.2012, 17:10     Проблема с итератором в <vector> #5
Haster,
zkod,
скажите в каком месте Book сравнивается со "строкой"?
Haster
инженер-системотехник
 Аватар для Haster
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
11.01.2012, 17:16     Проблема с итератором в <vector> #6
OstapBender,
Цитата Сообщение от pun4er Посмотреть сообщение
it=find(ob.v.begin(),ob.v.end(),x);//тут ошибка! описание ниже
как я понимаю x - это строка
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.01.2012, 18:49     Проблема с итератором в <vector> #7
Да.....
Там действительно лучше предикат.
zkod
5 / 5 / 0
Регистрация: 19.09.2009
Сообщений: 23
11.01.2012, 19:18     Проблема с итератором в <vector> #8
pun4er, а зачем вы в классе книга, создаёте контейнер книг?
Haster
инженер-системотехник
 Аватар для Haster
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
11.01.2012, 19:39     Проблема с итератором в <vector> #9
zkod, думаю он хотел сделать класс "книги" (Books), но получилось что получилось )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2012, 20:08     Проблема с итератором в <vector>
Еще ссылки по теме:

C++ Запись в vector<vector<char>>
Сортировка vector<vector<int>> C++
Записать vector<vector<wchar_t>> в текстовый файл C++

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

Или воспользуйтесь поиском по форуму:
zkod
5 / 5 / 0
Регистрация: 19.09.2009
Сообщений: 23
11.01.2012, 20:08     Проблема с итератором в <vector> #10
честно попробовал, посмотреть, что находится в контейнере после вызова delete_book()
сделал криво, но пытался сделать подобный класс, с подобными вызовами.
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
 
class X
{
    std::string title;
 
public:
    std::vector<X>vx;
 
    X(const std::string &str = "1")
    {
        title = str;
    }
 
    int delete_X()
    {
        X ob;
 
        ob.vx.push_back((std::string)"123");
        ob.vx.push_back((std::string)"456");
 
        for(unsigned int i=0; i<ob.vx.size(); ++i)
        {
            std::cout << ob.vx.at(i) << std::endl;
        }
        //ob.display();
        return 0;
    }
 
    friend std::ostream& operator<<(std::ostream& out,X x)
    {
        return out << x.title;
    }
 
    std::string getTitle()
    {
        return title;
    }
 
    void display()
    {
        std::cout << vx.size() << std::endl;
        for(std::vector<X>::iterator it = vx.begin(); it != vx.end(); ++it)
        {
            std::cout << it->getTitle() << std::endl;
        }
    }
};
 
int main()
{
    X x;
    x.delete_X();
    x.display();
 
    system("pause");
    return 0;
}
с ним работать не получится)

pun4er, оставь в классе только поля с конструктором + добавь геттеры, а контейнер и всё остальное делай например в отдельном классе "Библиотека"
Yandex
Объявления
11.01.2012, 20:08     Проблема с итератором в <vector>
Ответ Создать тему
Опции темы

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