C/C++

Почему мой код ничего не выводит. Я сейчас прохожу set в c++.

#include <bits/stdc++.h>
using namespace std;

int main() {
set<int>st;
set<int>st1;
int a, ans = 0, b;
while (cin >> a) {
st.insert(a);
}
while (cin >> b) {
st1.insert(b);
}
for (auto it : st1) {
cout << it;
}
}
B L
B L
455
А что, так можно было?
 while (cin >> a) 
Условие окончания ввода такое, что если там попадётся не число, то второй цикл не исполнится ни разу (cin >> b вернёт false), st1 останется пустым, и вывод будет пустым.

Какой вообще формат входных данных по постановке задачи?
Дима ***
Дима ***
87 571
Лучший ответ
B L Входные данные

Вводятся два списка чисел. Все числа каждого списка находятся на отдельной строке.
B L 1 3 2
4 3 2
B L Ну так это надо будет по всей строке проходить ещё раз и закидавать в set , разве это недолго будет?
B L или это быстро будет выполняться?
B L #include <bits/stdc++.h>
using namespace std;

int main() {
set<int>st;
string s;
getline(cin, s);
for (int i = 0; i < s.size(); i += 2) {
st.insert(s[i]);
}
for (auto it : st) {
cout << it;
}
} Вот новый код, здесь я решил написать(просто попробовать с одним set), почему теперь код код выводит какое-то рандомное число?
B L И ещё один вопрос. Как Вы вставляете в рамочке код?
Вот условие, при котором вы можете вводить целые числа в set отличные от нуля
 #include   
using namespace std;
int main() {
int n;
set a;
while (cin >> n, n) a.insert(n);
set b;
while (cin >> n, n) b.insert(n);
for (auto x : a) cout
Ravis Shaemov
Ravis Shaemov
85 874
Проблема в том, что ваша программа зацикливается на втором while-цикле с вводом чисел из стандартного потока ввода (cin), пока не будет достигнут конец файла (EOF). Блокировка ввода происходит после выполнения первого цикла while, который читает все доступные входные числа и сохраняет их в структуре данных set.

Чтобы решить эту проблему, можно использовать другой способ ввода элементов для второго множества, например, можно объявить int массив известного размера и использовать цикл for для заполнения элементов:

int n; // количество элементов второго множества
cin >> n;
int b;
for (int i = 0; i < n; i++) {
cin >> b;
st1.insert(b);
}
Или можно использовать следующую конструкцию вместо второго while-цикла:

cin.clear(); // очищает состояние потока ввода, чтобы снова разрешить ввод
cin.ignore(); // проигнорирует все символы до новой строки или EOF
Полный код с исправлениями:

#include <bits/stdc++.h>
using namespace std;

int main() {
set<int> st;
set<int> st1;
int a, ans = 0, b;
while (cin >> a) {
st.insert(a);
}
cin.clear();
cin.ignore();
while (cin >> b) {
st1.insert(b);
}
for (auto it : st1) {
cout << it << " ";
}
cout << endl;
return 0;
}
Здесь я добавил функцию clear () и ignore() для сброса потока ввода и использовал пробел для разделения выводимых чисел, чтобы получить читаемый вариант для вывода в консоль.
Влад Матьков
Влад Матьков
94 919
Ефим Рудаенко Если тут что-то и зацикливается, то только твой пустопорожний чатгпт.
 
while (cin >> a)
{
st.insert(a);
if (cin.peek() == '\n') break; //подглядываем следующий символ.
//Если это символ окончания строки, прерываем текущий цикл.
}
Можно прервать ввод, если следующий символ после числа - символ ввода \n
Его можно подсмотреть с помощью метода peek
Андреи Новак
Андреи Новак
51 417
Разрешите вставить свои 5 копеечек ООП:
 #include  
#include
#include
#include

template
class isline_iterator: public std::istream_iterator
{
std::istream* stream;
public:
isline_iterator(std::istream& s): stream(&s) {remove_leading_space_();} //конструктор вызывает нахождение первого значащего ( не пробельного символа в потоке )
isline_iterator():stream(nullptr) {}
isline_iterator(isline_iterator const& copy): stream(copy.stream) {}
isline_iterator& operator=(isline_iterator const& copy) {stream = copy.stream;return *this;}
bool operator==(isline_iterator const& rhs) const {return stream == nullptr && rhs.stream == nullptr;}
bool operator!=(isline_iterator const& rhs) const {return !(*this == rhs);}
T operator*() const {T value;(*stream) >> value;return value;} //*iterator возвращает значение текущего элемента типа Т
isline_iterator& operator++() {remove_leading_space_();return *this;} //переходим к началу следующего числа

private:
void remove_leading_space_(){
char c;
while((*stream) >> std::noskipws >> c) {
if (c == '\n')
break;
if (!std::isspace(c)) {
stream->putback(c); // возвращаем считанный символ обратно в поток
return;
}
}
stream = nullptr;
}
};

int main()
{
std::stringstream ss{"0 1 2 3 4 5 6 7 8 9 10\n11 12 13 14 15 16\n17 18 19"};
std::set s{isline_iterator(ss), isline_iterator()};
std::set s1{isline_iterator(ss), isline_iterator()};


for(std::cout