Написание структуры контейнера set

116
04 января 2021, 13:00

Написать структуру, которая обрабатывала бы входные данные следующим образом. На входе даётся целое число, указывающее количество операций. Затем сами операции:

операция добавление элемента в контейнер и сам элемент: ADD 5;

операция проверки наличие элемента и вывод в консоль "YES", если элемент есть и "NO", если элемент не найден: PRESENT 3;

вывод в консоль общее количество элементов конетейнера: COUNT.

Например: На входе:

4

ADD 5

PRESENT 3

PRESENT 5

COUNT

Ответ:

NO

YES

1

Код:

#include <iostream>
#include <set>
#include <algorithm>    
#include <string>
using namespace std;
struct SET{
    set<int>s;
    int add_num(int n){cin>>n; return s.insert(n);} 
    void present_num(int n);
    void COUNT();
};
void SET::present_num(int n){
    cout << (s.count(n) ? "YES" : "NO") << "\n"; // если количество не 
}                                       //0, тогда "YES", если 0, "NO".
void SET::COUNT(){
    cout << s.size() << endl;
}
int main(){
    int m, n;
    SET s;        
    for (int i = 0; i < m; ++i){
        string cmd;
        cin >> cmd;
        if(cmd == "ADD") {
            s.add_num(n);
        }
        else if (cmd == "PRESENT"){
            s.present_num(n);
        }
        else if (cmd == "COUNT") s.COUNT();
   }
   return 0;
}
Answer 1

Ошибки:

Вы не считываете количество команд. У вас есть цикл, где счетчик сравнивается с переменной m, но вы ее не инициализировали. Сделайте это перед входом в цикл, тогда считаете столько команд, сколько требуется.

Вы используете char для хранения строки. char - это один символ. Вам нужно использовать string. Функции strcmp, strncmp - они работают с типом char*. Вы можете конечно его использовать, но это подход более характерный для C, не C++. Будущее уже наступило, stringи можно сравнивать оператором ==.

Мелкие ошибки:

Вы объявили переменную n, передаете в функции, но нигде не пишете в нее. Вместо этого вы читаете из cin внутри функции add_num. Если вы передаете параметр, вы должны использовать не cin, а его. Считывать нужно в мейне, после того как определили команду.

Нет использования переменной item. Можно ее убрать.

Вы зачем-то возвращаете int из add_num, и не используете значение.

Почему не правы ваши преподаватели

Вам настоятельно рекомендуют использовать strncmp, и я так понял, не объяснили, почему. А разница вот в чем:

strcmp - сравнивает строки полностью, поэтому мы и не указываем длину при вызове.
strncmp - сравнивает только первые n символов.

Это значит, что если вы сравните строки вот так:

cout << strncmp ("ADDsgfdghfsdgh", "ADD", 3) << endl;

Ответ будет 0, типа строки равны, а на самом деле они не равны.

READ ALSO
Есть ли аналог библиотеки chrono в C?

Есть ли аналог библиотеки chrono в C?

Есть ли какая нибудь замена, либо аналогия временной C++ библиотеки chrono (в ходящей в пространство имен std) в C ??

143
Сравнение индексов в stl &lt;vector&gt;

Сравнение индексов в stl <vector>

Мне нужно от минимального элемента вектора до максимального поменять знаки элементов на противоположные

83
c++: нулевое значение std::chrono::time_point&lt;std::chrono::system_clock&gt;

c++: нулевое значение std::chrono::time_point<std::chrono::system_clock>

Подскажите как можно выставить пустое/нулевое значение для типа

125
Как подключить llvm к проекту visual studio 2017?

Как подключить llvm к проекту visual studio 2017?

Выходят ошибки вроде "class "llvm::Attribute" не содержит члена "ArgMemOnly", "не удаётся открыть источник файл llvm/IR/Intrinsicsgen" и похожие

123