Как сравнить первый элемент (строку) пары в векторе пары с другой строкой? - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь реализовать то, что я узнал о std::vector, чтобы решить проблему.Пользователь собирается ввести список имен животных (не указано, сколько), и мне нужно записать имена животных и их появления в пользовательском вводе.Сначала я попытался использовать массив, но, поскольку он статический, я переключился на std::vector.Опять же, сначала я попытался использовать два std::vector, один с типом int, а другой с типом string для хранения имен животных и количества вхождений.Тем не менее, кажется немного сложным отсортировать оба вектора позже, и std::vector с типом pair звучит лучше в моей памяти.И теперь, я застрял с этим кодом ниже с ошибками, которые я не совсем понимаю:

#include <bits/stdc++.h>
#include <sstream>

using namespace std;

int position(vector< pair<string, int> > myList, string animalName) {
    int pos;
    for (int i = 0; i < myList.size(); i++) if (animalName.compare(myList[i].first) == 0) pos = i;
    return pos;
}

int main() {
    int Q;
    cin >> Q;

    vector< pair<string, int> > zooPair;
    string animal;

    for (int i = 0; i < Q; i++){
        cin >> animal;
        if (find_if(zooPair.begin(), zooPair.end(), animal.compare(zooPair.first) == 0) == zooPair.end())
            zooPair.emplace_back(animal, 1);
        else
            zooPair[position(zooPair, animal)].second += 1;
    }

    sort(zooPair.begin(), zooPair.end());

    for (vector< pair<string, int> >::iterator it = zooList.begin(); it != zooList.end(); it++)
        cout << *it;

    return 0;
}

1 Ответ

0 голосов
/ 10 ноября 2018

Вы просто должны использовать std::map в качестве типа контейнера, потому что он уже сортируется, имеет простой в использовании интерфейс доступа с оператором []. Здесь мы создаем std::map с вашим животным и количеством их в вашем зоопарке.

Пример:

int main() {
    int Q;
    std::cout << "Enter number of entries" << std::endl;
    std::cin >> Q;

    std::map<std::string, int> zoo;

    std::string animal;

    for (int i = 0; i < Q; i++){
        std::cout << "Enter animal" << std::endl;
        std::cin >> animal;
        zoo[animal]++;
    }

    for ( auto& it: zoo )
    {
        std::cout << it.first << " " << it.second << std::endl;
    }


    return 0; 
}

Как видите, нет необходимости в дополнительной сортировке, поскольку карта всегда сортируется по первой части, называемой «ключом» каждой записи.

То же самое с std::vector. Обратите внимание, что вы должны предоставить операторы для сортировки и поиска!

Полный пример:

struct SortableElements: public std::pair< std::string, int >
{
    // forward construction 
    using std::pair<std::string, int>::pair;

    // use for sort: 
    bool operator < (const SortableElements& e2 ) const
    {
        return first < e2.first;
    }

    // use for find: 
    bool operator == ( const std::string& e2 ) const
    {
        return first == e2;
    }
};



int main() 
{   
    std::vector< SortableElements > zoo;

    int Q;
    std::cout << "Enter number of entries" << std::endl;
    std::cin >> Q;

    std::string animal;

    for (int i = 0; i < Q; i++){
        std::cout << "Enter animal" << std::endl;
        std::cin >> animal;

        auto it = std::find( zoo.begin(), zoo.end(), animal);
        if ( it != zoo.end())
        {
            it->second++;
        }
        else
        {
            zoo.emplace_back( animal, 1 );
        }
    }

    // sort:
    std::sort(zoo.begin(), zoo.end());

    for ( auto& it: zoo )
    {
        std::cout << it.first << " " << it.second << std::endl;
    }

    return 0;
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...