#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;
}
}
C/C++
Его можно подсмотреть с помощью метода peek
Почему мой код ничего не выводит. Я сейчас прохожу set в c++.
А что, так можно было?
Какой вообще формат входных данных по постановке задачи?
while (cin >> a)
Условие окончания ввода такое, что если там попадётся не число, то второй цикл не исполнится ни разу (cin >> b вернёт false), st1 останется пустым, и вывод будет пустым.Какой вообще формат входных данных по постановке задачи?
Вот условие, при котором вы можете вводить целые числа в 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
Проблема в том, что ваша программа зацикливается на втором 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() для сброса потока ввода и использовал пробел для разделения выводимых чисел, чтобы получить читаемый вариант для вывода в консоль.
Чтобы решить эту проблему, можно использовать другой способ ввода элементов для второго множества, например, можно объявить 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() для сброса потока ввода и использовал пробел для разделения выводимых чисел, чтобы получить читаемый вариант для вывода в консоль.
Ефим Рудаенко
Если тут что-то и зацикливается, то только твой пустопорожний чатгпт.
while (cin >> a)
{
st.insert(a);
if (cin.peek() == '\n') break; //подглядываем следующий символ.
//Если это символ окончания строки, прерываем текущий цикл.
}
Можно прервать ввод, если следующий символ после числа - символ ввода \nЕго можно подсмотреть с помощью метода peek
Разрешите вставить свои 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
Похожие вопросы
- Как оптимизировать код, чтобы не было превышения по времени к задаче (C++, динамическое программирование)?
- Как оптимизировать код, чтобы не было превышения по времени к задаче (C++)?
- Почему этот код не работает? Я только начал изучать программирование, не понимаю почему не работает игра в конце
- По вашему мнению почему первый код правильным не является?
- С++. Почему в методе set_union единица повторяется несколько раз? Код и скриншот ниже
- Помогите пожалуйста написать код на c++, выводящий имя, фамилию и дату рождения нескольких человек
- Помогите с кодом C++
- Ошибки в коде c++
- Что не так с кодом C++ ?
- Написать код для задачи C++
Вводятся два списка чисел. Все числа каждого списка находятся на отдельной строке.
4 3 2
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), почему теперь код код выводит какое-то рандомное число?