【问题标题】:How to sort out the structure based on the result and show the output according to ranking?如何根据结果对结构进行排序并根据排名显示输出?
【发布时间】:2015-07-15 12:26:32
【问题描述】:

我大约一个月前才开始学习 C++ 编程。我很难根据排名进行排名和打印输出。我遵循了论坛中发布的一些想法,我的代码如下。我不知道我错过了什么以及代码是如何工作的。我要做的是根据尝试字段按升序排序player_data[5],然后在经过时间的情况下再次排序player_data[5],其中数组的顺序基于尝试,然后经过时间如果尝试是一样的。整理完数组的结构后,我想根据排名来cout。有人会告诉我我缺少什么并简要解释代码本身。 TIA

#include <algorithm>
using namespace std;
bool player_sorter(player_score const& lhs,player_score const& rhs);

struct player_score
{
    char name[31];
    int num_attempt;
    time_t time_elapsed;
} player_data[5];

bool player_sorter(player_score const& lhs, player_score const& rhs)
{
    if (lhs.num_attempt != rhs.num_attempt)
        return lhs.num_attempt < rhs.num_attempt;
    if (lhs.time_elapsed != rhs.time_elapsed)
        return lhs.time_elapsed < rhs.time_elapsed;
}

【问题讨论】:

    标签: c++ arrays output


    【解决方案1】:

    std::sort 函数适用于标准容器,据我所知,它不适用于 C 样式数组。你应该定义你的类型:

    typedef struct player_score
    {
        char name[31];
        int num_attempt;
        time_t time_elapsed;
    } player_score;
    

    然后声明数据的实际容器:

    std::vector<player_score> player_data;
    

    装满容器后,您可以对其进行分类

    std::sort(player_data.begin(), player_data.end(), player_sorter);
    

    函数 sort 是一种排序算法的实现,可能是 Quicksort。如果你这样称呼它,你就是在告诉函数你想要从头到尾排序,整个容器。第三个参数是执行&lt; 比较的函数,它是确定一个元素是在另一个之前还是之后的基础。

    另外,即使两个player_score 相等,player_sorter 也必须返回一个值,您应该在函数末尾添加一个return false,因为在这种情况下,第一个操作数并不严格小于第二个操作数但它是平等的。如果操作员是&lt;=,您将返回true。

    【讨论】:

      【解决方案2】:

      std::sort 在大多数情况下提供“足够好”的排序速度和复杂性。这是一个使用不同结构和std::sort 以及几种排序方式的示例。

      struct foo {
          int a;
          int *b = nullptr;
          bool operator<(const foo & other) const {
              return (a < other.a);
          }
      }
      void printvec(const std::vector<foo> & vec) {
          for ( foo & f : vec ) {
              std::cout << f.a << "\t" << (void*)f.b;
              if ( f.b ) {
                  std::cout << "\t" << *f.b;
              }
              std::cout << "\n";
          }
      }
      bool sort_foos_on_b(const foo & a, const foo & b) {
          // if both are nullptr
          if ( (nullptr == a.b) && (nullptr == b.b) ) {
              return false;
          }
          // if one is nullptr
          if ( (nullptr == a.b) != (nullptr == b.b) ) {
              return (nullptr != a.b);
          }
          return (*a.b) < (*b.b);
      }
      void bar() {
          const constexpr size_t MAX_FOO = 20;
          std::default_random_engine generator;
          std::uniform_int_distribution<int> rng(0,MAX_FOO-1);
          std::vector<foo> vec(MAX_FOO);
      
          // initialize
          for ( foo & f : vec ) {
              f.a = rng(generator);
              if ( f.a & 1 ) {
                  f.b = &f.a;
              }
          }
      
          // uses foo::operator<()
          std::sort(vec.begin(), vec.end());
          printvec(vec);
      
          // uses lambda
          std::sort(vec.begin(), vec.end(), [](const foo & a, const foo & b) -> bool {
              // sorting on pointer because why not
              return (f.a < f.b);
          });
          printvec(vec);
      
          // uses explicit sort function
          std::sort(vec.begin(), vec.end(), sort_foos_on_b);
          printvec(vec);
      }
      

      bool foo::operator&lt;() const 用于对foo::a 进行排序。 lambda 用于根据foo::b 的指针值进行排序。 显式排序函数用于根据foo::b是否为空进行排序,如果两者都不为空,则为foo::b指向的值。

      您可以看到每个方面的权衡。使用operator&lt; 将提供一种默认的排序方法(无需为std::sort 指定排序函数)。 lambda 允许您在使用它的地方自定义排序。如果您需要从不同位置以相同的方式进行排序(而不是在任何地方重复相同的 lambda),将使用显式排序函数。

      免责声明:我从内存中编写了上面的代码 sn-p,目前无法访问编译器,因此它可能无法“按原样”编译

      【讨论】:

        猜你喜欢
        • 2014-06-25
        • 2019-01-21
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        • 2014-12-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多