C++利用stl::sort对结构体数组中的字符串成员排序

之前发过的帖中,有讲到过对结构体字符串进行排序的,除了手写之外,便想到用C/C++中的qsort来对结构体数组中的字符串进行排序。但是推广到sort中时,想了好久也没想明白,看看网上这样的帖也比较少,其实还是很好理解的,主要是std::sort的cmp函数要求是bool的返回值,随意抓住这点就可以。

问题大概是这样:

#include <iostream>
#include <cstdio>
#define MAXN 50
using namespace std;

struct tmpToStruct{
    char ArraryString[MAXN];
};

tmpToStruct step[5+1];

int main()
{
    for(int i=0;i<5;i++)
        scanf("%s",step[i].ArraryString);
    return 0;
}

step里的ArraryString按照字符串的字典序进行排序,下面给出sort排序的方法:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 50
using namespace std;

struct tmpToStruct{
    char arrStr[MAXN];
};

tmpToStruct step[5+1];

bool upCmp(const tmpToStruct &tmp1,const tmpToStruct &tmp2){
         return strcmp(tmp1.arrStr,tmp2.arrStr)<0 ? true : false;
}

bool downCmp(const tmpToStruct &tmp1,const tmpToStruct &tmp2){
         return strcmp(tmp1.arrStr,tmp2.arrStr)>0 ? true : false;
}
int main()
{
    puts("before the sort:");
    for(int i=0;i<5;i++)
        scanf("%s",step[i].arrStr);
    cout << endl;

    sort(step,step+5,upCmp);
    puts("after the up sort:");
    for(int i=0;i<5;i++)
        puts(step[i].arrStr);
    cout << endl;

    puts("after the down sort:");
    sort(step,step+5,downCmp);
    for(int i=0;i<5;i++)
        puts(step[i].arrStr);
    cout << endl;
    return 0;
}

对比下qsort的排序,还是很简短的。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
<h3>回答1:</h3><br/>可以使用C++的string类和数组来解决这个问题。具体来说,可以先使用getline函数从输入流读取一行字符串,然后使用for循环和条件判断来实现逆序输出该字符串,并计算该字符串最多包含的单词数。需要注意的是,字符串不包含空格或者其他分隔符时可以使用句点符号作为单词之间的分隔符。如果想要更加简洁高效的代码,可以使用STL算法函数,如reverse和count_if等来实现该功能。 <h3>回答2:</h3><br/>本题需要使用c新特性来编写程序,需要借助string类数组来实现。首先,我们可以用一个string类型的变量来输入字符串,并用空格分隔单词,将单词存入string类数组,最后再逆序输出该数组即可。 代码如下: ```C #include <iostream> #include <cstring> using namespace std; int main() { string str; string words[20]; int cnt = 0; getline(cin, str); // 输入字符串 string word = ""; for (int i = 0; i < str.size(); i++) { // 按空格分隔单词 if (str[i] == ' ') { words[cnt++] = word; word = ""; } else { word += str[i]; } } words[cnt++] = word; // 最后一个单词 for (int i = cnt - 1; i >= 0; i--) { // 逆序输出数组 cout << words[i] << ' '; } cout << endl; return 0; } ``` 这里利用C++的string类型来方便地存储单词和操作字符串,也使用了数组来存储单词,这也是C++的基本数据结构之一。当然,如果对于输入的字符串有更复杂的要求(比如包含标点符号、特殊字符等),可以在代码进行相应的处理。 <h3>回答3:</h3><br/>为了实现这个任务,我们可以使用C++11的新特性,在输入数据的同时将字符串分割为单个单词。我们可以用string类数组来实现,它可以存储多个字符串。然后,我们可以使用一个for循环来逆序输出这些单词。 首先,让我们定义一个字符串数组并初始化为20个空字符串: string str[20] = {"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""}; 然后,我们可以使用getline(cin, input)函数来输入一个字符串。该函数每次从输入流读取一行输入并存储在变量input。接着,我们可以使用一个istringstream对象来将输入字符串分割成单个单词: istringstream ss(input); // 定义一个istringstream对象 string word; // 定义一个字符串 int i = 0; // 定义一个变量i,用来记录单词的数量 while (ss >> word) { str[i++] = word; // 将分割出来的单词存入字符串数组str } 这样,我们就可以将输入的字符串分割成单个单词并存储到字符串数组str了。接着,我们可以使用一个for循环逆序输出这些单词: for (int j = i - 1; j >= 0; j--) { cout << str[j] << " "; // 按逆序输出单词 } 完整的程序代码如下: #include <iostream> #include <string> #include <sstream> using namespace std; int main() { string str[20] = {"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""}; string input; getline(cin, input); istringstream ss(input); string word; int i = 0; while (ss >> word) { str[i++] = word; } for (int j = i - 1; j >= 0; j--) { cout << str[j] << " "; } cout << endl; return 0; } 需要注意的是,本程序忽略了字符串的标点符号,并且最多只能输出20个单词。如果需要更高的可扩展性,可以将字符串数组大小设置为动态取值即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摇着酒壶敲代码

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值