【问题标题】:How to sort arrays by variable (int - least to greatest) in arrays?如何按数组中的变量(int - 最小到最大)对数组进行排序?
【发布时间】:2015-11-11 03:51:51
【问题描述】:

我有 10 个这样的数组:

    #include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <sstream>

using namespace std;

struct person
{
    int age, i;
    char name[20], dob[20], pob[20], gender[7];
};

int main ()
{
    int i = 0;
    person person[10];
    for (i; i<10; i++)
    {
        cout << "Please enter your name, date of birth, place of birth, gender, and age, separated by a space.\nFor example, John 1/15/1994 Maine Male 20: ";
        scanf("%s %s %s %s %d", &person[i].name, &person[i].dob, &person[i].pob, &person[i].gender, &person[i].age);
        printf("%s %s %s %s %d \n", &person[i].name, &person[i].dob, &person[i].pob, &person[i].gender, person[i].age);
    }
    sort(person)
    return 0;
}

如何按年龄对所有这些数组进行排序?年龄是一个整数,从最小到最大?谢谢。

【问题讨论】:

  • 你应该使用 std::vector
  • @Mikhail 为什么会这样?
  • @johnny880 与数组相比,它们在空间和时间方面效率更高。
  • @NickyC 好吧,他没有使用矢量,所以它可能不是重复的。虽然他应该使用矢量...

标签: c++ arrays sorting c++11 int


【解决方案1】:

创建一个 lambda 为

auto func = [](Person p1, Person p2)
{
   return p1.age1 < p2.age2;
}

使用std::sort 对项目进行排序

std::sort(person.begin(),person.end(),func);

希望对你有帮助

工作代码如下所示

#include <iostream>
#include <algorithm>
#include <array>

struct Person{
    std::string name_, dob_, pob_;
    char gender_;
    int age_;

    Person(std::string name,std::string dob, std::string pob,char gender,int age)
    :name_(name),dob_(dob),pob_(pob),gender_(gender),age_(age)
    {
    }

    void print() const
    {
        std::cout<<name_<<" , "<<dob_<<" , "<<pob_<<" , "<<gender_<<" , "<<age_<<'\n'; 
    }
};

int main()
{


    std::array<Person,10> arr{
        Person{"AA","12/12/12","BB",'M',24},
        Person{"AA","12/12/12","BB",'M',23},
        Person{"AA","12/12/12","BB",'M',22},
        Person{"AA","12/12/12","BB",'M',21},
        Person{"AA","12/12/12","BB",'M',20},
        Person{"AA","12/12/12","BB",'M',34},
        Person{"AA","12/12/12","BB",'M',33},
        Person{"AA","12/12/12","BB",'M',32},
        Person{"AA","12/12/12","BB",'M',31},
        Person{"AA","12/12/12","BB",'M',30}
    };
    auto func = [] (Person p1,Person p2)
    {
        return p1.age_ < p2.age_;
    };
    std::sort(arr.begin(),arr.end(),func);

    for(auto const & item:arr)
    {
        item.print();
    }
}

【讨论】:

  • 我不明白?对不起,你能在代码中实现它吗?谢谢。
  • 已编辑 OP。也许我没有解释清楚。请再看一遍
  • 您首先阅读了 C 中的基本输入/输出,请参阅代码中的 scanfprintf 行。一旦您正确读取数据,此处建议的任何解决方案都将起作用。
【解决方案2】:

使用#include&lt;algorithm&gt; 附带的std::sort(begin, end, comparator) 函数并提供您的自定义比较器,在这种情况下为

bool comparator(Person i, Person j) {
     return i.age < j.age;
}

std::sort(&Person[0], &Person[len], comparator);
//better alternative
std::sort(std::begin(Person), std::end(Person), comparator);

【讨论】:

  • 我不明白?对不起,你能在代码中实现它吗?谢谢。
  • 排序功能为您提供排序功能。您只需将数组的开头和结尾传递给它。由于您的数据是自定义数据,因此无法知道如何对其进行排序。你可能会得到突然的结果。这就是为什么第三个参数是函数指针的原因。排序函数每次尝试比较两个 Person 对象时都会调用它。如果第一个元素小于第二个元素,则此函数应返回 false,否则返回 true。 @johnny880
  • 已编辑 OP。也许我没有解释清楚。请再看一遍
  • @FaizHalde:如果len 是元素的数量,那么您的第一个示例应该是std::sort(&amp;Person[0], &amp;Person[len], comparator);。第二个参数需要是一个 one-past-the-end 迭代器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2021-08-12
  • 2020-09-26
  • 2019-05-11
  • 1970-01-01
  • 2017-08-01
相关资源
最近更新 更多