Программа C++, использующая стандартные библиотечные контейнеры

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

Напишите программу на C++, которая считывает int из стандартного ввода до конца файла, а затем выводит их в обратном порядке — по одному на строку. Используйте контейнеры стандартной библиотеки для хранения данных. Нет использования нового оператора.

Как бы я это сделал, если бы мне пришлось использовать контейнеры стандартной библиотеки?

int main()
int i = 0;
{int array[];

vector<int> integers (array, array+ array.size)
for (i=0; i<array.size, i++) 
   cin>>a[i];

vector<int>::const_reverse_iterator reverse iterator;

^^это пока мой псевдокод, который еще не готов. Любая обратная связь?


person user3819671    schedule 25.11.2014    source источник
comment
вы можете попробовать std::vector, std::list и т.д...   -  person fatihk    schedule 25.11.2014
comment
Вы должны получить хороший справочник по этим библиотекам, например: en.cppreference.com/w Использование STL не сложно.   -  person user1942027    schedule 25.11.2014
comment
Поздравляем вашего учителя с тем, что он научил своих учеников пользоваться стандартной библиотекой.   -  person Shoe    schedule 25.11.2014
comment
C++ чувствителен к регистру, поэтому не используйте NEW; вместо этого используйте новый, если что.   -  person kdog    schedule 25.11.2014
comment
@Jeffrey Также поздравляю с фактическим запретом new. Это ключевое слово больше не должно появляться в повседневном коде, ИМО.   -  person Chnossos    schedule 25.11.2014
comment
Это не тот сайт, где можно попросить нас сделать вашу работу за вас. Рекомендуемое чтение: Что это за STL по сравнению со "Стандартной библиотекой C++" "ссориться из-за чего?"   -  person    schedule 25.11.2014
comment
@Jeffrey Разве это больше не изучаемая тема?   -  person user3819671    schedule 25.11.2014
comment
@Chnossos - мне любопытно, почему бы и нет. Есть ли причина, по которой нельзя возвращать экземпляр объекта из функции? В случае, если это не так, как еще вы могли бы предложить вернуть указанный объект, не выходя из области видимости, когда функция завершилась? :любопытный:   -  person enhzflep    schedule 25.11.2014
comment
Вы делаете это, читая о различных контейнерах и алгоритмах стандартной библиотеки и написав некоторый код.   -  person juanchopanza    schedule 25.11.2014
comment
@enhzflep Вы возвращаете объект по значению.   -  person juanchopanza    schedule 25.11.2014
comment
@Chnossos Запрещать новое - это столько же культа карго, сколько и поощрять его. Не понимая, почему new плохой, ОП так же невежественен, как и раньше.   -  person    schedule 25.11.2014
comment
@enhzflep В настоящее время (начиная с C++11 или даже C++0x) мы просто используем интеллектуальные указатели и контейнеры STL, возвращаемые по значению, и позволяем компилятору перемещать память за нас.   -  person Chnossos    schedule 25.11.2014
comment
@user3819671 user3819671 Проблема в другом. Учителя продолжали преподавать по-старому, используя new и выполняя ручное управление памятью, что привело к тому, что ученики так и не научились более современному и простому способу, используя средства, уже предоставленные STL. Тем не менее, это все еще полезно для понимания ручного способа, если он вам действительно нужен, но это следует преподавать после того, как студенты уже знакомы с простым способом STL.   -  person user1942027    schedule 25.11.2014
comment
@РафаэльМ. Меня учили ручному способу до STL, поэтому мне любопытно узнать, как бы я отнесся к STL, если бы я изучил ручной способ позже. STL был представлен нам только сегодня, так что я до сих пор чувствую себя очень ошеломленным им. Я надеюсь, что кодирование небольших вещей, подобных этой программе, поможет укрепить концепцию, стоящую за ней.   -  person user3819671    schedule 25.11.2014
comment
Вернемся к вопросу ... Я предлагаю вам взглянуть на ответ Матеуша, а затем попытаться изменить выходной цикл, чтобы использовать ваш const_reverse_iterator ... вам нужно будет использовать rbegin() и rend(). Быстрый Google должен предоставить вам примеры. Вам не нужны ни int array[], ни int i. Попробуйте начать с самых простых вещей и продолжайте компилировать программу. Используйте 'std::cout ‹‹ xyz ‹‹ std::endl;' для вывода переменных во время работы вашей программы, чтобы вы могли убедиться, что она делает то, что вы ожидаете, например, - выведите integers.size(), чтобы увидеть увеличение размера вектора.   -  person Tony Delroy    schedule 25.11.2014


Ответы (2)


Я не могу говорить за других, но я думаю, что неосторожное использование аббревиатуры "STL" является интеллектуально нечестным. Если вы хотите сослаться на "стандартную библиотеку C++", так и скажите. Аббревиатура может означать много разных вещей, включая стандартную библиотеку, оригинальную реализацию STL (которой более десяти лет) или любой из ее портов. Для получения дополнительной информации см. Что такое STL по сравнению с "C++ «Стандартная библиотека»?

Что касается изучения C++, многие студенты, кажется, пренебрегают одним из самых важных (и очень дорогих) ресурсов, которые у них есть, — школой. Если у вас возникли проблемы, всегда сначала обратитесь к учителю. Спросите помощника учителя. Спросите других студентов. Найдите репетитора в кампусе. Нажми на библиотеку. Если в вашей библиотеке нет нужной вам книги, попросите, чтобы ее доставили в ваш кампус. Но я дам вам презумпцию сомнения и предполагаю, что вы уже сделали это.

Если вам нужна справка, попробуйте cppreference. Для новичка разобрать не очень просто, хотя значительно упрощает язык от стандартного. Если вам нужен учебник, попробуйте любую из миллионов книг Бьерна Страуструпа. (преувеличение). Язык программирования C++ (4-е издание) — хороший выбор. На веб-сайте ISO C++ также перечислены популярные компиляторы, интерактивные компиляторы и небольшой список книг, написанных деятелями C++ (Херб Саттер , Скотт Мейерс и т. д.) Существует также C++-faq Маршалла Клайна (разные авторы).

Люди также, похоже, забывают, что StackOverflow — это ресурс. Люди потратили сотни часов на faq c++ и даже просто сортировать вопросы C++ по голосам дает много высококачественного контента для просмотра. Если этого недостаточно, отсортируйте страницу пользователя по репутации и найдите пользователей. которые являются экспертами в C++ и читают их вопросы и ответы. Вы не можете сказать, что не смогли найти ответ на свою проблему после всего этого.

Ничто из того, что я написал до сих пор, не является ответом на вопрос, поэтому давайте решим вашу проблему.

Ваш текущий код показывает:

int main()
int i = 0;
{
  int array[];

  vector<int> integers (array, array+ array.size)
  for (i=0; i<array.size, i++) 
     cin>>a[i];

  vector<int>::const_reverse_iterator reverse iterator;

Первая проблема — это ваша декларация стиля K&R. int i = 0 нужно внутри файла main. Затем у вас есть массив неизвестных границ. В данном контексте это недопустимо. Просто начните с std::vector, здесь массив не нужен. И, наконец, вам не нужен reverse_iterator, и я покажу вам, почему через секунду.

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v;
    int current_num;
    while (std::cin >> current_num)
        v.push_back(current_num); 
}

Эта идиома, std::cin >> current_num, полезна, потому что она лаконична и цикл завершится корректно (т. е. при неправильном вводе пользователя или EOF). См. Почему iostream::eof внутри условия цикла считается неправильным ? для более подробного объяснения.

Теперь вы хотите напечатать целые числа в обратном порядке. У вас есть три способа сделать это:

std::sort(v.rbegin(), v.rend());
std::reverse(v.begin(), v.end()); // #include <algorithm>

Затем выполните цикл и распечатайте каждый элемент. Или используйте цикл, который выполняет итерацию по вектору в обратном направлении при печати каждого элемента. Два приведенных выше метода практически эквивалентны, но я включил rbegin(), потому что он возвращает обратный итератор, демонстрируя, что вам не нужно иметь дело с голым итератором.

Я не буду давать длинных объяснений, потому что сейчас 3:30 утра, но, надеюсь, это поможет вам начать. Удачи.

person Community    schedule 25.11.2014

Если вы начинаете, лучше всего использовать std::vector.

vector<int> v;
int temp = 0;

while(cin>>temp)
{
    v.push_back(temp);
}

for(int i=0; i<v.size(); i++)
    cout<<v[v.size()-1-i] <<endl;
person MateuszZawadzki    schedule 25.11.2014
comment
Люди могут спорить о том, хорошо ли предоставлять полное решение для домашней работы, но голосование против этого немного грубо, особенно если это от нового пользователя .... +1 - person Tony Delroy; 25.11.2014
comment
@TonyD Но есть более простые способы перебора элементов вектора в обратном порядке. Это подвержено ошибкам и не нужно. Хорошим советом было бы посмотреть, что вектор может сделать для вас. Этот ответ даже не следует этому основному совету. - person juanchopanza; 25.11.2014
comment
@juanchopanza Да, я это знаю, но когда вы видите, что кто-то начинает изучать новую тему и спрашивает об очень простых темах, давать слишком сложный ответ нехорошо. Перво-наперво. Узнайте о векторе, а затем перейдите к более сложным темам (например, итераторам) после тестирования некоторых основных функций. Это мое мнение. - person MateuszZawadzki; 25.11.2014
comment
@MateuszZawadzki Спорный вопрос о том, менее ли это сложно, чем использование итераторов. Это, конечно, менее безопасно. - person juanchopanza; 25.11.2014
comment
@juanchopanza: менее сложное, чем использование итераторов, спорно - я согласен - спорно в обоих случаях - поэтому я бы сказал, что ответ Матеуша не является необоснованным, и полезный комментарий был бы, но рассмотрите возможность использования обратных итераторов, как только вы заработаете (как я рекомендовал в комментарий непосредственно к вопросу 30 минут назад). Людям достаточно легко случайно разыменовать end() или rend() или случайно сравнить reverse_iterator с end(), поэтому я не считаю менее подверженный ошибкам аргумент убедительным. - person Tony Delroy; 25.11.2014