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

Вектор пользовательского типа данных - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Horlos
0 / 0 / 0
Регистрация: 10.10.2013
Сообщений: 19
15.12.2013, 03:46     Вектор пользовательского типа данных #1
Имеется класс:
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
class Students {
    public:
        void set_name(string student_name)
        {
            name = student_name;
        }
        string get_name()
        {
            return name;
        }
        void set_last_name(string student_last_name)
        {
            last_name = student_last_name;
        }
        string get_last_name()
        {
            return last_name;
        }
        void set_rating(double ball)
        {
            rating = ball;
        }
        double get_rating()
        {
            return rating;
        }
private:
        string last_name;
                string name;
        double  rating;
        Students ();
        Students(string _last_name, string _name, double _rating): last_name(_last_name), name(_name), rating(_rating) 
    {}
};
Нужно создать вектор пользовательского класса:
C++
1
vector<Students> v;
Записать в него данные:
C++
1
v.push_back(student);
Далее нужно выполнить поиск в векторе по указанной фамилии, и всю информацию, что связана с данной фамилией удалить из контейнера. Пытаюсь реализовать это так:
C++
1
2
3
4
5
6
string x;
cout<<"Введите фамилию студента, которого хотите удалить: ";
cin>> x;
vector<Students>::const_iterator it;
it = find(v.begin(), v.end(), x);   
v.erase(it);
Но компилятор ругается на функцию find, что логично, так как сравниваю класс и переменную типа string нельзя.
Как я понял, нужно в классе перегрузить оператор сравнения ==.
Вот тут и возник вопрос, как это реализовать? Как перегрузить оператор == для сравнения объекта класса и объекта типа string?
Так не работает:
C++
1
2
3
4
static bool operator ==(Students& a, string&  b)
            {
                return a.last_name == b;
            }
Исправьте, пожалуйста, подскажите, дайте напутствие на правильную реализацию)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2013, 03:46     Вектор пользовательского типа данных
Посмотрите здесь:

C++ как вызвать метод из указателя на вектор пользовательского типа
C++ Передача в контейнер map пользовательского типа данных
Вектор объектов пользовательского класса C++
Массив объектов пользовательского типа в vector C++
Преобразование типа из пользовательского в стандартный и из стандартного в пользовательский C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.12.2013, 04:06     Вектор пользовательского типа данных #2
Такой оператор ИМХО делать не стоит, лучше написать отдельный функциональный объект и использовать его; примерно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct compare_last_name {
 
   explicit compare_last_name(std::string const& last_name) : last_name(last_name) {}
 
   bool operator ()(Student const& student) const {
      return student.get_last_name() == last_name;
   }
 
private:
   std::string const last_name;
};
 
// ...
 
vector<Students>::const_iterator it = find_if(v.begin(), v.end(), compare_last_name(x));
Либо std::bind2nd + std::equal + std::mem_fun_ref (std::bind\лямбда-функция, если есть) - но это может быть страшно)
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2013, 04:16     Вектор пользовательского типа данных #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
#include <string>
#include <vector>
#include <algorithm>
 
struct Str
{
  std::string str1;
  std::string str2;
};
 
bool operator == (const Str& lhs, const std::string& rhs)
{
  return lhs.str1 == rhs;
}
 
//bool operator == (const std::string& lhs, const Str& rhs)
//{
//  return rhs == lhs;
//}
 
int main()
{
  std::vector<Str> strs;
  std::string str;
  std::find(strs.begin(), strs.end(), str);
  return 0;
}
но правильнее делать как сказали выше: std::find_if + какой-нибудь предикат.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.12.2013, 04:19     Вектор пользовательского типа данных #4
Но если хочеться, то вне класса
C++
1
2
3
bool operator ==(Student const& student, std::string const& name) {
   return student.get_last_name() == name;
}
Добавлено через 2 минуты
Кстати, все get_* методы стоит сделать константными (что бы их можно было вызывать для константного объекта) - состояния объекта они всё равно не меняют.
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
15.12.2013, 04:29     Вектор пользовательского типа данных #5
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
.....
    std::vector<Students> vectorOfStudent;
 
    vectorOfStudent.reserve( 2 );
 
    Student student1( "Petr", "Petrov", 90 );
    Student student2( "Ivan", "Ivanov", 77 );
 
    vectorOfStudent.push_back( student1 );
    vectorOfStudent.push_back( student2 );
 
    std::string lastNameToCompare = "Petrov";
 
    for ( int i = 0; i < vectorOfStudent.size(); i++ )
    {
        static int index = 0;
 
        if ( ( vectorOfStudent[ index ] ).compareLastName( lastNameToCompare ) )
        {
            vectorOfStudent.erase( index );
        }
        else 
        {
            ++index;
        }
    }
......
 
bool Student::compareLastNames( const string & str )
{
    if ( last_name.compare( str ) == 0 )
        return true;
    else
        return false;
}
gray_fox
15.12.2013, 04:31
  #6

Не по теме:

Цитата Сообщение от StackOverflow Посмотреть сообщение
C++
1
last_name.compare( str ) == 0
Зачем использовать compare вместо оператора сравнения?

StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
15.12.2013, 04:38     Вектор пользовательского типа данных #7
gray_fox,

Не по теме:

Не обращай внимания, это уже мои собственные причуды и капризы

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2013, 05:09     Вектор пользовательского типа данных
Еще ссылки по теме:

Сохранение данных пользовательского типа в list из stl C++
Преобразование пользовательского типа, friend C++
C++ Создание пользовательского типа данных

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

Или воспользуйтесь поиском по форуму:
Horlos
0 / 0 / 0
Регистрация: 10.10.2013
Сообщений: 19
15.12.2013, 05:09  [ТС]     Вектор пользовательского типа данных #8
Так:
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
#include <string>
#include <vector>
#include <algorithm>
 
struct Str
{
  std::string str1;
  std::string str2;
};
 
bool operator == (const Str& lhs, const std::string& rhs)
{
  return lhs.str1 == rhs;
}
 
//bool operator == (const std::string& lhs, const Str& rhs)
//{
//  return rhs == lhs;
//}
 
int main()
{
  std::vector<Str> strs;
  std::string str;
  std::find(strs.begin(), strs.end(), str);
  return 0;
}
и так:

C++
1
2
3
bool operator ==(Student const& student, std::string const& name) {
   return student.get_last_name() == name;
}
Работает! Спасибо, ошибки понял)

Добавлено через 1 минуту
Цитата Сообщение от StackOverflow Посмотреть сообщение
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
.....
    std::vector<Students> vectorOfStudent;
 
    vectorOfStudent.reserve( 2 );
 
    Student student1( "Petr", "Petrov", 90 );
    Student student2( "Ivan", "Ivanov", 77 );
 
    vectorOfStudent.push_back( student1 );
    vectorOfStudent.push_back( student2 );
 
    std::string lastNameToCompare = "Petrov";
 
    for ( int i = 0; i < vectorOfStudent.size(); i++ )
    {
        static int index = 0;
 
        if ( ( vectorOfStudent[ index ] ).compareLastName( lastNameToCompare ) )
        {
            vectorOfStudent.erase( index );
        }
        else 
        {
            ++index;
        }
    }
......
 
bool Student::compareLastNames( const string & str )
{
    if ( last_name.compare( str ) == 0 )
        return true;
    else
        return false;
}
Изначально выкрутился таким же методом! Но нужно реализовать именно встроенными алгоритмами find, далее sort и прочие..
Yandex
Объявления
15.12.2013, 05:09     Вектор пользовательского типа данных
Ответ Создать тему
Опции темы

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