Как правильно использовать контейнер 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
Разберём по порядку:
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; // вывод объектов
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
На сайте Microsoft, есть статья, как привязать Google test к VS: ссылкаВыполнив начальный этап, а именно установка адаптера для этих тестов, я пробую...
Подскажите как отсортировать список по имени, фамилии и году
Захотел научиться программировать на C++Скачал CodeLite, создал workspace, new project и скопировал текст программы "Hellow world!" в новый файл
в теме по ссылке Реализация функции atoi для меня кое что неясно: зачем от текущей ячейки s[i] отнимать символ '0'? И можно ли фильтр содержимого...