【问题标题】:Sort a string array in Alphabetical Order - C++ 11按字母顺序对字符串数组进行排序 - C++ 11
【发布时间】:2018-04-21 03:44:20
【问题描述】:

我正在准备面试,在查看候选人经历时,我遇到了以下问题 -

给定一个字符串数组:{ “Sdjksajd”, “Skjdasjj”, “Bjsdakja”, “Xhudhau”, “Eeeeggg”, “Chrome”}。在不使用库函数的情况下按字母顺序显示它们。

我不太擅长编码,所以我尝试使用我有限的知识通过以下方式进行此操作:-

#include<iostream>
#include<string>
using namespace std;
string selsort(string s);

string selsort(string s)
{
int i=0,j,k=0;
string min=&s[i];
for(i=0;i<6;i++)
{
    for(j=i+1;j<6;j++)
    {
        if(s[j][k]<s[i][k])
        {
            string *temp;
            min=s[j];
            *temp=s[i];
            s[i]=s[j];
            s[j]=*temp;
        }
        else if(s[j][k]=s[i][k])
        {
                while(k<=s[j].length())
                {
                k++;
                selsort(string s);
                }
             }

        }
   }
     return s;
}

 int main()
 {
     int i;
     string s[6]={"Sdjksajd","Skjdasjj","Bjsdakja","Xhudhau","Eeeeggg","Chrome"};

  s=selsort(s);
  for(i=0;i<6;i++)
  cout<<s[i];
  return 0;
  }

但是,我收到“错误:数组下标的无效类型 'char[int]'”,我认为我的程序需要更多修改才能使其工作。我该如何解决这个问题?

【问题讨论】:

  • 正确答案是“不使用库函数就无法显示任何东西”。
  • 虽然这是真的,但我认为他们的意思是让我们在不使用库函数对字符串元素进行排序或比较的情况下解决它。

标签: arrays string c++11


【解决方案1】:

虽然问题表明您不能只使用库排序,但这并不意味着您不能启发库排序。

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );

还要注意对RandomIt 的额外限制:它必须是 ValueSwappable(并且取消引用可移动类型)。注意指向数组的指针是RandomIt,字符串是Swappable

所以我们有两个部分:

  • 比较事物
  • 重新安排事情

暂时,假设我们有一个Compare(我们稍后会定义一个)

现在排序集合的一个明显属性是第一个元素小于其他所有元素。我们可以想象一个函数RandomIt min_element(RandomIt first, RandomIt last, Compare comp) 找到范围的最小元素。因此,我们可以将第一个元素与最小的元素交换,然后继续处理范围的其余部分。这样排序就变成了:

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp )
{
    for (RandomIt it = first; it != last; ++it)
    {
        RandomIt min = min_element(it, last, comp);
        swap(*it, *min);
    }
}

现在我们需要实现min_element。我们可以遍历范围,使用Compare 保持当前最小值。

template< class RandomIt, class Compare >
RandomIt min_element( RandomIt first, RandomIt last, Compare comp )
{
    RandomIt min = first;
    for (RandomIt it = first; it != last; ++it)
    {
        if (comp(*it, *min)) { min = it; }
    }
    return min;
}

我们还需要swap

template< typename T >
void swap(T & lhs, T & rhs)
{
    T temp = static_cast<T&&>(lhs);
    lhs = static_cast<T&&>(rhs);
    rhs = static_cast<T&&>(temp);
}

现在我们有了排序功能,我们只需要能够按字母顺序比较std::strings。幸运的是,&lt; 是为字符串定义的,所以我们只有:

bool string_less(const std::string & lhs, const std::string & rhs)
{
    return lhs < rhs;
}

我们可以把这一切放在一起

void string_sort(std::string * values, std::size_t count)
{
    sort(values, values + count, string_less);
}

【讨论】:

  • 非常感谢!我在朋友的帮助下解决了这个问题。似乎我们缺少了有助于比较字符串的字符串比较函数“bool string_less”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 2018-11-20
  • 2021-12-19
  • 1970-01-01
相关资源
最近更新 更多