Почему мой код ничего не выводит. я сейчас прохожу set в c++. - Вопросы по С+
  • Чаты 4chT.com в телеграмм
    Наши группы в телеграмм

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

Регистрация
4 Авг 2013
Сообщения
71
Репутация
0
Спасибо
1
Монет
0
#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;

}

}
 
Регистрация
26 Ноя 2013
Сообщения
89
Репутация
0
Спасибо
0
Монет
0
Проблема в том, что ваша программа зацикливается на втором 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() для сброса потока ввода и использовал пробел для разделения выводимых чисел, чтобы получить читаемый вариант для вывода в консоль.
 
Регистрация
28 Дек 2013
Сообщения
90
Репутация
0
Спасибо
0
Монет
0
Вот условие, при котором вы можете вводить целые числа в 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
 
Регистрация
29 Ноя 2013
Сообщения
107
Репутация
1
Спасибо
0
Монет
0
Разрешите вставить свои 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
 
Регистрация
1 Ноя 2013
Сообщения
82
Репутация
0
Спасибо
0
Монет
0
А что, так можно было? while (cin >> a) Условие окончания ввода такое, что если там попадётся не число, то второй цикл не исполнится ни разу (cin >> b вернёт false), st1 останется пустым, и вывод будет пустым.

Какой вообще формат входных данных по постановке задачи?
 
Сверху Снизу