【问题标题】:Sorting upper and lower case words in vector of strings对字符串向量中的大写和小写单词进行排序
【发布时间】:2015-12-04 03:18:51
【问题描述】:

我正在尝试按字母顺序排列字符串向量中的单词,并且我的程序区分大小写字母,因此大写单词总是首先出现在排序列表中。我可以想出一些潜在的非常麻烦的方法来确保大写单词在他们的位置上,但是有没有一种简单的方法来做到这一点?

这是我的代码:

for (int i = 0; i < str.size(); i++)
    {
        for (int j = 0; j < str.size(); j++) 
        {
            if (str.at(i) > str.at(j))
            {               
                temp = str.at(j);
                str.at(j) = str.at(i);
                str.at(i) = temp;
            }   
        }
    }

另外,这是一个编程任务,所以我不允许使用内置的 C++ 函数来执行此操作,我必须使用向量。

【问题讨论】:

  • 是否可以将std::sort() 与自定义大于函数一起使用??

标签: c++ sorting alphabetical


【解决方案1】:

解决这个问题的诀窍是为这一行写一个替换

if (str.at(i) > str.at(j))

执行不区分大小写的比较。首先为它写一个签名:

bool greaterThanIgnoreCase(const string& left, const string& right) {
    ...
}

现在您可以调用这个新函数来替换您的 if 条件:

if (greaterThanIgnoreCase(str.at(i), str.at(j)))

最后,您需要提供greaterThanIgnoreCase 函数的实现。这是问题的核心,所以你需要自己做。它的诀窍是对字符串leftright 的每个字符使用touppertolower 函数,并一次比较它们一个字符。如果其中一个字符串中的字符用完,则应将剩余一些字符的字符串视为更大。

【讨论】:

    【解决方案2】:

    您唯一需要做的就是比较小写字符。如果您不允许使用任何内置函数,您可以手动执行。

    由于小写字符位于从 97 开始的 ASCII 表中,而大写 - 从 65 开始,您只需将 32 添加到大写字符即可获得其小写等效字符。

    char lowerCase(char c)
    {
        if (c >= 'A' && c <= 'Z') // if char is uppercase
            return (char)(c + 32); // return its lowercase equivalent
        else
            return c;
    }
    

    然后,您可以在 if 条件下执行以下操作:

    if (lowerCase(str.at(i)) > lowerCase(str.at(j)))
    

    请注意,您应该只在比较时使用lowerCase,而不是在分配时使用。

    这里是working IDEOne demo

    【讨论】:

      【解决方案3】:

      如果您有strings 中的vector,那么您可以/应该使用STL 库,该库为给定的比较函数提供sortstable_sort(可以是简单的lambda 表达式、函子、函数,...)。

      更新:您不能使用除矢量以外的内置类型。 在这种情况下,您可以轻松开发 STL 所做的复制。

      定义一个接收比较器的排序函数(用于字符串向量)。

      【讨论】:

      • 来自问题:“我不允许使用内置 C++ 函数”
      • 抱歉,我没看到。
      猜你喜欢
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      相关资源
      最近更新 更多