如何将成对向量中成对的第一个元素(字符串)与另一个字符串进行比较?

时间:2018-11-10 09:44:56

标签: c++ vector

我正在尝试利用我对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 :(得分:1)

您只应该使用std::map作为容器类型,因为它已经排序,并且具有易于使用的operator []访问接口。在这里,我们用您的动物及其动物园中的动物数量创建一个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;
}