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.
Другие вопросы по тегам