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

C++ и класс set, требуется релизовать - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
K12
 Аватар для K12
5 / 5 / 1
Регистрация: 22.08.2010
Сообщений: 99
09.12.2012, 15:06     C++ и класс set, требуется релизовать #1
Привет всем!

Ранее никогда не имел дела с контейнерными кламмами STL, возникла необходимость написать программу на С++, которая бы вела учет пассажиров на ж/д вокзале (лабораторная в институте). Параметры для учета такие: номер поезда, станция назначения, время отправления. Реализовать всё это нужно через класс SET.

Может ко смог бы помочь за вознаграждение, был бы очень рад.

Пытался сам разобраться, но даже простой пример не компилируется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <set> //Чтобы использовать set необходимо подключить заголовочный файл <set>
#include <iostream.h>
using namespace std;
int main(void)
{ 
    std::set<int> s;   //Создаем переменную типа set
    s.insert(10); //Добавляем 10
    s.insert(20); //Добавляем 20 
    s.insert(10); //Пытаемся добавить 10, но в set не может содержаться
              //несколько одинаковых объектов, поэтому объект не добавляется
    //В данный момент s.size() == 2
    return 0;
}
Ругается:
Error: main.cpp(6,18):Too few arguments in template class name 'set'
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.12.2012, 15:10     C++ и класс set, требуется релизовать #2
Не может быть, все должно компилироватся, пруф.
K12
 Аватар для K12
5 / 5 / 1
Регистрация: 22.08.2010
Сообщений: 99
09.12.2012, 17:56  [ТС]     C++ и класс set, требуется релизовать #3
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Не может быть, все должно компилироватся, пруф.
А разве этот codepad проверяет корректность кода? Я думал он только синтаксис проверяет. тем не менее, может Вы сможете помочь мне?

Добавлено через 2 часа 38 минут
Спасибо за внимание, в С++ Builder 6 всё отлично откимпилилось, а в старой версии не хотел.
K12
 Аватар для K12
5 / 5 / 1
Регистрация: 22.08.2010
Сообщений: 99
10.12.2012, 19:38  [ТС]     C++ и класс set, требуется релизовать #4
Кто подскажет, как этот в класс SET поместить 3 типа данных? Ну вот в примере выше - я так понял в этом классе содержится целое число.
Мне нужно "засунуть" туда целое число, и два текстовых (наверное char или string).
Очень нужно, помогите пожалуйста!
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
10.12.2012, 19:51     C++ и класс set, требуется релизовать #5
Цитата Сообщение от K12 Посмотреть сообщение
"засунуть" туда целое число, и два текстовых
То есть
Цитата Сообщение от K12 Посмотреть сообщение
номер поезда, станция назначения, время отправления?
Создайте структуру или класс с такими полями. А потом вместо set<int> - set<имя_класса>.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11835 / 6814 / 769
Регистрация: 27.09.2012
Сообщений: 16,889
Записей в блоге: 2
Завершенные тесты: 1
11.12.2012, 09:45     C++ и класс set, требуется релизовать #6
Цитата Сообщение от K12 Посмотреть сообщение
А разве этот codepad проверяет корректность кода?
Если что, то это компилятор...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.12.2012, 10:58     C++ и класс set, требуется релизовать #7
Schizorb, И перегрузку оператора < не забыть или функтор указать.
K12
 Аватар для K12
5 / 5 / 1
Регистрация: 22.08.2010
Сообщений: 99
11.12.2012, 19:05  [ТС]     C++ и класс set, требуется релизовать #8
Итак, хочу поделиться новостями:
Сделал так, как посоветовал уважаемый Schizorb, получился такой текст.
Пробую добавить запись в эту структуру - не дает. Я уверен, что делаю неверно, но никак разобраться не могу, подскажите, пожалуйста, как это сделать?
Вопросы сформулирую кратко:
1) Точно ли это получился класс SET?
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
25
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#include <set>
#include <conio.h> 
#pragma hdrstop
#include <string.h>
//---------------------------------------------------------------------------
#pragma argsused
 
using namespace std;
 
struct poezd
{
int pnumber;       // номер поезда
char pstation[40]; // станция назначения
char time[5];      // время прибытия
};
 
int main(void)
{ 
    std::set<poezd> pset;   //Создаем переменную типа set
 
    pset.insert(1, "Station", "time"); //Пробуем добавить запись
}
Кстати, всё делаю я на Borland C++ Builder 6
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.12.2012, 19:14     C++ и класс set, требуется релизовать #9
K12, Эм. А конструктор? ну если нет конструктора тогда создать объект poezd заполнить его и сделать insert. Ну и оператор < перегрузить не забудьте все же.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
11.12.2012, 19:28     C++ и класс set, требуется релизовать #10
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 <iostream>
#include <set>
#include <string>
 
 
class Train
{
    public:
        Train() {}
        Train (int number, std::string station, std::string time) :
            _number(number), _station(station), _time(time) {}
        friend bool operator < (const Train &t1, const Train &t2)
        {
            return t1._number < t2._number;
        }
    private:
        int _number;          // номер поезда
        std::string _station; // станция назначения
        std::string _time;    // время прибытия
};
 
int main()
{
    std::set<Train> pset;   //Создаем переменную типа set
    // pset.insert({1, "Station", "time"}); //Пробуем добавить запись
    pset.insert(Train (1, "Station", "time")); //Пробуем добавить запись
}
K12
 Аватар для K12
5 / 5 / 1
Регистрация: 22.08.2010
Сообщений: 99
11.12.2012, 19:30  [ТС]     C++ и класс set, требуется релизовать #11
Цитата Сообщение от ForEveR Посмотреть сообщение
K12, Эм. А конструктор? ну если нет конструктора тогда
Извините за ламерский вопрос, но если можно без конструктора, тогда зачем он вообще?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.12.2012, 19:31     C++ и класс set, требуется релизовать #12
MrGluck, Посоветовал бы не юзать имена, начинающиеся с подчеркивания... Передавать стринги через const ссылку (если мы не о С++11 говорим), ну и оператор < сделал бы не френдом (но это уже субъективно, хотя, если есть возможность, то не стоит вводить зависимости лишние).
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
11.12.2012, 19:32     C++ и класс set, требуется релизовать #13
Цитата Сообщение от K12 Посмотреть сообщение
Извините за ламерский вопрос, но если можно без конструктора, тогда зачем он вообще?
Вам без конструктора нельзя. Как вы компилятору объясните, что
C++
1
(1, "Station", "time")
это объект Train?
K12
 Аватар для K12
5 / 5 / 1
Регистрация: 22.08.2010
Сообщений: 99
11.12.2012, 19:36  [ТС]     C++ и класс set, требуется релизовать #14
Уважаемый MrGluck, откомпилировал, всё замечательно. Спасибо
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
11.12.2012, 19:39     C++ и класс set, требуется релизовать #15
ForEveR, насчет конст ссылок для с++03 - согласен, а имена с подчеркиваниями - во многих гайдах по код стайлу написано таким образом обозначать поля класса, чтобы не было путаницы. И в некоторых исходниках видел подобную вещь.
Ну и с френд оператором - лень было get метод писать, пример скорее показательный)
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
#include <iostream>
#include <set>
#include <string>
 
 
class Train
{
    public:
        Train() {}
        Train (int number, const std::string &station, const std::string &time):
            _number(number), _station(station), _time(time) {}
        int getNumber() const
        {
            return _number;
        }
    private:
        int _number;          // номер поезда
        std::string _station; // станция назначения
        std::string _time;    // время прибытия
};
 
bool operator < (const Train &t1, const Train &t2)
{
    return t1.getNumber() < t2.getNumber();
}
 
int main()
{
    std::set<Train> pset;   //Создаем переменную типа set
    // pset.insert({1, "Station", "time"}); //Пробуем добавить запись
    pset.insert(Train (1, "Station", "time")); //Пробуем добавить запись
}
K12
 Аватар для K12
5 / 5 / 1
Регистрация: 22.08.2010
Сообщений: 99
11.12.2012, 19:43  [ТС]     C++ и класс set, требуется релизовать #16
Спасибо! Пробую реализовать другие функции
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.12.2012, 19:44     C++ и класс set, требуется релизовать #17
Цитата Сообщение от MrGluck Посмотреть сообщение
во многих гайдах по код стайлу написано таким образом обозначать поля класса
Только подчеркивание при этом ставят после имени.
А имена, начинающиеся с подчеркивания, зарезервированы для разработчиков компиляторов(также как и имена, содержащие двойные подчеркивания).
K12
 Аватар для K12
5 / 5 / 1
Регистрация: 22.08.2010
Сообщений: 99
11.12.2012, 20:01  [ТС]     C++ и класс set, требуется релизовать #18
Вот размышляю, теперь нужно реализовать поиск и вывод такой инфы:
* вывод всех занесенный поездов
* поиск по номеру
* поиск по станции
Пробую сделать так, но не выходит.
Нашел информацию:
Задача сравнения объектов возникает в STL очень часто. Например, если функция
find
ищет в интервале первый объект с заданным значением, она должна уметь сравнивать два объекта и узнавать, совпадают ли их значения. При попытке включения нового элемента в множество функция
set::insert
должна проверить, не существует ли данное значение в контейнере.
Но не понятно откуда вызвать эту функцию. Подскажете? Напрямую find(...) не работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2012, 20:04     C++ и класс set, требуется релизовать
Еще ссылки по теме:

C++ Перегрузка функций (Создать класс Set )
Требуется разработать класс C++
C++ Требуется добавить шаблон в класс

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
11.12.2012, 20:04     C++ и класс set, требуется релизовать #19
Цитата Сообщение от K12 Посмотреть сообщение
Вот размышляю, теперь нужно реализовать поиск и вывод такой инфы:
* вывод всех занесенный поездов
* поиск по номеру
* поиск по станции
Пробую сделать так, но не выходит.
Нашел информацию:


Но не понятно откуда вызвать эту функцию. Подскажете? Напрямую find(...) не работает.
Ты работаешь с не POD типом, операторы < , = не определены. Либо описывай данные операторы, либо используй лямбда-функции, либо функторы.
Yandex
Объявления
11.12.2012, 20:04     C++ и класс set, требуется релизовать
Ответ Создать тему
Опции темы

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