1mpl3m3nt векторный стек и вывод сохраненного и подсчитанного элемента
Вот мой код:
В настоящее время у меня есть все, что пользователь вводит в стек и сортирует, но я не знаю, как и куда идти дальше. Я пытался решить ее с помощью переменной count, но мое решение не является правильным (оно должно вывести "2 dog" только один раз, если пользователь вводит dog дважды). Если кто-то может помочь или знает способ решить эту проблему, приведите пример.
3 ответа
Вы должны использовать карту. Но если вы ищете другой ответ, используйте поиск по всем элементам. после того, как вы прочитаете все элементы ввода, начните цикл по вектору. получить первый элемент, сохранить его значение и удалить его, затем проверить другие элементы размера 1, чтобы увидеть, равны ли они этому. если да, добавьте счетчик и удалите элемент из вектора. Обратите внимание, что размер уменьшился. Теперь снова сделайте то же самое, пока размер не станет 0.
Есть несколько способов сделать это. Самым простым является простое использование std::map
:
#include <iostream>
#include <string>
#include <map>
int main()
{
std::map<std::string, unsigned int> mymap;
std::string s;
while (std::getline(std::cin, s) && !s.empty() && s != "END")
++mymap[s];
for (auto const& pr : mymap)
std::cout << pr.second << ':' << pr.first << '\n';
}
Как это устроено
- Каждая строка читается, и в случае успеха (не eof, не пустой и не эквивалентный "END") используется для обновления записи в карте.
- Согласно документации для
std::map::operator []
, если требуемый ключ еще не присутствует на карте, он добавляется, и сопоставленное значение инициализируется значением. Заunsigned int
это означает, что начальное значение0
, - Оттуда приращение применяется к возвращенному
unsigned int
ссылка, которая для нового элемента приводит к значению1
для существующих элементов просто увеличивает предыдущее значение. - Это продолжается до тех пор, пока цикл не завершится.
По окончании цикла результаты сообщаются в лексикографическом порядке с предшествующим их подсчетом.
вход
one
two
three
four
three
one
one
one
two
END
Выход
1:four
4:one
2:three
2:two
Если вы хотите отсортировать вывод по количеству, потребуется проделать дополнительную работу, но это не сложно. Набор пар с карты, перевернутый так, чтобы счетчик был первым, а строка вторым, делает короткую работу над этим:
#include <iostream>
#include <string>
#include <map>
#include <set>
int main()
{
std::map<std::string, unsigned int> mymap;
std::string s;
while (std::getline(std::cin, s) && !s.empty() && s != "END")
++mymap[s];
std::set<std::pair<unsigned int, std::string>> ms;
for (auto const& pr : mymap)
ms.insert(std::make_pair(pr.second, pr.first));
for (auto const& pr : ms)
std::cout << pr.first << ':' << pr.second << '\n';
}
Пример запуска показан ниже:
вход
one
two
three
four
three
one
one
one
two
END
Выход
1:four
2:three
2:two
4:one
Используйте std::map, как указано в комментарии:
std::map<std::string, unsigned int> countMap;
while(enter!=endString){
getline(cin,enter);
countMap[enter]++; // Operator `[]` enters a new key if not present and
// default initializes the value.
//, else fetches and increases the corresponding value
}
// coutMap[str] gives the number of times `str` entered.