【问题标题】:Sorting a vector of structs c++ [duplicate]对结构向量进行排序c ++ [重复]
【发布时间】:2020-12-15 22:15:37
【问题描述】:

我有一个结构,其中数据定义为:

typedef struct contacts 
{
    string name;
    string nickName;
    string phoneNumber;
    string carrier;
    string address;
    //callDetails callDetails;

} contactDetails;

vector <contactDetails> proContactFile;

我在向量中有 10 -20 个信息字段。 我需要对name(按字母顺序)进行冒泡排序,并在名称前面显示其他相应的数据。(例如,在对名称进行排序后,我想在排序后的名称前面显示相应的nickname , phone number ,carrieraddress。)有简单的方法吗?

【问题讨论】:

    标签: c++ vector struct


    【解决方案1】:

    了解“自定义比较器”将解决您的问题。这是实现预期结果的方法之一。我使用cmp 作为自定义比较器。请注意,它是在调用sort() 时传递的。

    如果您明天需要根据其他内容进行排序,例如phoneNumber,这种方式很有用。您需要的唯一更改是将比较器函数添加或更新为return c1.phoneNumber &lt; c2.phoneNumber;

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    typedef struct contacts
    {
        string name;
        string nickName;
        string phoneNumber;
        string carrier;
        string address;
        //callDetails callDetails;
    } contactDetails;
    
    //sort based on name
    bool cmp (const contacts& c1, const contacts& c2) {
        return c1.name < c2.name;
    }
    
    void print(vector <contactDetails> proContactFile) {
        for (auto s : proContactFile) {
            cout << s.name << " " << s.nickName << " " << s.phoneNumber << " " << s.carrier << " " << s.address << endl;
        }
    }
    
    int main()
    {
        vector <contactDetails> proContactFile;
    
        proContactFile.push_back({"name1","nickName1","phone1","carrier1", "address1"});
        proContactFile.push_back({ "ame1","ickName1","hone1","arrier1", "ddress1" });
        proContactFile.push_back({ "me1","ckName1","one1","rrier1", "dress1" });
        proContactFile.push_back({ "e1","kName1","ne1","rier1", "ress1" });
    
        sort(proContactFile.begin(), proContactFile.end(), cmp);
        print(proContactFile);
    }
    

    【讨论】:

      【解决方案2】:

      你试过标准模板库吗?

      #include <algorithm>
      #include <functional>
      #include <array>
      #include <iostream>
       
      int main()
      {
          std::array<int, 10> s = {4, 7, 6, 3, 9, 2, 1, 0, 8, 3}; ; 
       
          // sort using the default operator<
          std::sort(s.begin(), s.end());
      }
      

      见:https://en.cppreference.com/w/cpp/algorithm/sort

      您只需为您的类型定义比较运算符“

      【讨论】:

      • 是的,我尝试过类似的方法。但它对我不起作用..我的意思是我只能对名称进行排序..我无法在名称前面打印其他相应的数据。
      • 不清楚你的意思。按名称对向量进行排序以获得排序向量,然后您可以在另一个循环中从排序向量中包含的结构字段中打印任何内容。我错过了什么?
      • 我的意思是我只能按字母顺序排序和打印名称。但是在这里我想在排序后的名称前面打印相关的nick name,carrier, phone numaddress。所以基本上我在项目中所做的是将文件读入向量然后排序。
      • "您只需要为您的类型定义比较运算符 '
      猜你喜欢
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多