【问题标题】:Way to sort a string array that contains both numbers and letters numerically? (C++)对同时包含数字和字母的字符串数组进行数字排序的方法? (C++)
【发布时间】:2021-03-08 10:53:47
【问题描述】:

程序必须有一天前的一堆提醒的输入,例如:(数字)(提醒)。 当输入 0 时,所有提醒必须按天顺序输出。我只是不确定如何按天数对这些提醒进行排序。

#include <iostream>

using namespace std;

int main() {
  string sentence[50];
  int i = 0;
  while (sentence[i - 1] != "0") {
    cout << "Enter a day and reminder: ";
    getline(cin, sentence[i]);
    ++i;
  }
  i = 0;
  while (i <= 50 && sentence[i] != "0" && sentence[i] != "") {
    cout << sentence[i] << "\n";
    ++i;
  }
}

【问题讨论】:

  • sentence[i - 1]i 最初为 0 时超出范围。
  • 您的第一个循环调用未定义行为,因为您将尝试访问元素 -1,然后查看 std::sort
  • 您需要从输入阶段单独解析字符串或获取并存储这两个信息。

标签: c++ arrays string


【解决方案1】:

使用std::sort,特别是采用比较器的重载。

您必须编写一个比较器,在开头使用数字数据比较您的字符串。

这是一个示例,基于上面 cppreference 链接中的示例:

struct Comparator
{
    bool operator()(string a, string b) const
    {
        ...
        return ...;
    }
};

std::sort(&sentence[0], &sentence[i], Comparator());

【讨论】:

    【解决方案2】:

    将数字读取为数字,将行的其余部分读取为文本,进入某种结构。为该结构定义一个&lt;,该结构以您想要的顺序排列事物。对您的值集合进行排序。

    struct Reminder {
        int day;
        std::string text;
    }
    
    bool operator <(const Reminder & lhs, const Reminder & rhs) {
        return lhs.day < rhs.day;
    }
    
    std::ostream& operator<<(std::ostream& is, const Reminder & rem) {
        return is << rem.day << " " << rem.text << "\n";
    }
    
    int main() {
        std::vector<Remainder> rems;
        
        for (Remainder rem; (std::cin >> rem.day) && (rem.day != 0);) {
            std::getline(std::cin, rem.text);
            rems.push_back(rem);
        }
    
        std::sort(rems.begin(), rems.end());
    
        for (const auto & rem : rems) {
            std::cout << rem;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-28
      • 2021-02-22
      • 2019-03-28
      • 2019-05-26
      • 2020-02-18
      • 1970-01-01
      • 2010-11-23
      相关资源
      最近更新 更多