set с классом компаратором c++

225
20 марта 2018, 02:00

Как правильно использовать контейнер set, состоящий из класса и компаратора? Написала код, но выдает очень много ошибок. Пример: Как выглядит класс:

 class pr_aff {
       private: char ml; long long mn; string name,sname,date; 
       public: char Ml ()const{return ml;}
       long long Mn()const{return mn;}
        string  Name()const{return name;}
        string  SName()const{return sname;}
        string  Date()const{return date;}
       };

Как выглядит main:

std::set<pr_aff,cmp> myset;
    pr_aff p;
    cin>>n;
    for(i=0;i<=n-1;i++)
    {
        cin>>myset[i].Sname();
        cin>>myset[i].Name();
        cin>>str;
        cin>>myset[i].Date();
        int j=0;
        a=0;
        while(str[j]>='0' && str[j]<='9')
        {
            a++;
            j++;
        }
        x=0;
        for(int j=0;j<=a-1;j++)
            x=x*10+int(str[j])-int('0');
        myset[i].Mn()=x;
        myset[i].Ml()=str[a];
    }*

Код полностью: https://pastebin.com/FZvnqs6T Необходимо использовать set<1,2> p; где 1 = имя типа для личного дела, 2 = имя компаратор. Рабочий код без классов: https://pastebin.com/FzTyscH3 Ссылка на задачу: http://informatics.msk.ru/moodle/mod/statements/view3.php?chapterid=1404&run_id=2115r138524#1

Answer 1

Разберём по порядку:

std::set<pr_aff,cmp> myset; // что такое cmp? Приведите, как эта переменная определена.
pr_aff p; // эта переменная где-то используется?
cin>>n;
for(i=0;i<=n-1;i++)
{
    cin>>myset[i].Sname(); // 1. set - это не map, так работать с ним не получится. Хотя бы потому что для него не определён оператор [];
    cin>>myset[i].Name();  // и 2. что вы здесь вообще пытаетесь сделать? Я понимаю, что вы хотели, но вы очевидно не понимаете, как работает написанный вами код.
    cin>>str;
    cin>>myset[i].Date(); // см. комментарии выше
    int j=0;
    a=0;
    while(str[j]>='0' && str[j]<='9') // какова сущность Mn и Ml? Без знания этого сложно сказать, насколько корректен код ниже.
    {
        a++;
        j++;
    }
    x=0;
    for(int j=0;j<=a-1;j++)
        x=x*10+int(str[j])-int('0');
    myset[i].Mn()=x;
    myset[i].Ml()=str[a];
}* // звёздочка явно лишняя

Переделывать ваш код не вижу смысла, приведу пример правильного кода:

// 1. Определим произвольную структуру:
class MyObject
{
    public:
        // Методы доступа к значениям закрытых членов класса:
        const string& getStringField() const { return m_strField; }
        int getIntField() const { return m_intField; }
        double getRealField() const { return m_realField; }
        // Методы установки значений закрытых членов класса:
        void setStringField(const string& str) { m_strField = str; }
        void setIntField(int value) { m_intField = value; }
        void setRealField(double value) { m_realField = value; }
    private:
        // Члены класса:
        string m_strField;
        int m_intField = 0;
        double m_realField = 0.0;
};
// 2. Определим пару операторов ввода/вывода:
istream& operator>> (istream& src, MyObject& dest)
{
    string strField;
    int intField = 0;
    double realField = 0.0;
    // читаем из потока во временные переменные
    src >> strField >> intField >> realField;
    // устанавливаем значения:
    dest.setStringField(strField);
    dest.setIntField(intField);
    dest.setRealField(realField);
    return src;
}
ostream& operator<< (ostream& dest, const MyObject& src)
{
    dest << src.getStringField() << src.getIntField() << src.getRealField();
    return dest;
}
// 3. Определим метод создания объекта с вводом данных:
MyObject createMyObject()
{
    MyObject result;
    cin >> result;
    return result;
}
// 4. Для контейнера set необходима функция-компаратор (обычно operator<):
bool compareMyObjects(const MyObject& left, const MyObject& right)
{
    return (   left.getIntField() < right.getIntField()
            || left.getRealField() < right.getRealField()
            || left.getStringField() < right.getStringField());
}
// 5. Теперь объединим все написанные части:
int count = 0;
cin >> count; // ввод количества объектов
set<MyObject, compareMyObjects> objects;
while (count-- > 0)
{
    objects.insert(createMyObject()); // создание и заполнение объектов
}
for (const auto& each : myobjects)
{
    cout << each << endl; // вывод объектов
}
READ ALSO
Google test framework и Visual Studio

Google test framework и Visual Studio

На сайте Microsoft, есть статья, как привязать Google test к VS: ссылкаВыполнив начальный этап, а именно установка адаптера для этих тестов, я пробую...

162
Как отсортировать односвязный список

Как отсортировать односвязный список

Подскажите как отсортировать список по имени, фамилии и году

395
g++.exe fatal error no input files compilation terminated codelite КАК ИСПРАВИТЬ

g++.exe fatal error no input files compilation terminated codelite КАК ИСПРАВИТЬ

Захотел научиться программировать на C++Скачал CodeLite, создал workspace, new project и скопировал текст программы "Hellow world!" в новый файл

200
программная реализация функции atoi

программная реализация функции atoi

в теме по ссылке Реализация функции atoi для меня кое что неясно: зачем от текущей ячейки s[i] отнимать символ '0'? И можно ли фильтр содержимого...

244