对字符串指针数组进行排序

Posted

技术标签:

【中文标题】对字符串指针数组进行排序【英文标题】:Sorting a pointer array of strings 【发布时间】:2018-03-03 02:35:57 【问题描述】:

我的 sortArray 函数中的交换函数似乎无法正常工作。错误是: No viable overloaded operator[] for type 'string *' (aka 'basic_string<char, char_traits<char>, allocator<char> > *').

我设法找到了输出中最先出现的项目,但现在我只需要一些帮助才能让其余的用户输入按预期显示。 回顾一下,程序需要从用户那里读取许多单字名称(每个口袋妖怪一个)并将名称存储在一个数组中。用户输入完他们的名字后,程序应该显示用户输入的所有口袋妖怪的列表,但按字母顺序排列。我得到的最远的输出是:

Welcome! How many Pokemon do you own?

4

Ok, enter the names!

Pikachu

Snorlax

Ekans

Squirtle

输出:

Thanks, here are the pokemon you entered: Ekans Ekans Ekans Ekans Program ended with exit code: 0

这是我的代码:

#include <iostream>
#include "playground.h"
using namespace std;

string findFirst(string *x, int start, int end)

    string first = x[0];
    for(int i=start; i <= end; i++)
    
        if(x[i] < first)
        
            first = x[i];
        
    
    return first;


void sortArray(string *items, int start, int end)

    for(int i=start; i<=end; i++)
    
        string min = findFirst(items,i, end);
        swap(items[i], items[min]);
    



int main()

    cout<<"Welcome! How many Pokemon do you own?"<<endl;
    int num = 0;
    cin >> num;

    cout<< "Ok, enter the names!"<<endl;
    string *names = new string[num];
    for(int i=0; i<num; i++)
    
        cin>>names[i];
    
    cout<<"Thanks, here are the pokemon you entered: ";
    for(int i=0; i<num; i++)
    
        cout << sortArray(names, 0, num) << " ";
            

    return 0;

【问题讨论】:

或许阅读cplusplus.com/reference/algorithm/sort ...和en.cppreference.com/w/cpp/algorithm/for_each 你的数组是一个字符串数组。该数组的索引是整数。 stringArray[stringReturnedFromFunction] 没有意义,但stringArray[indexOfStringYouFoundInTheFunction] 有。 那些都处理数字排序..我可以做到,字符串有点不同..至少对我来说很好 您的程序还有许多其他问题,例如您希望如何输出 void 函数的结果,并且您至少在两个地方偏离了一个。除非您必须编写自己的排序算法,否则最好使用 std::vector 字符串和 std::sort 【参考方案1】:

C++ 就是不重新发明***。它专为编写库和通用代码而设计,例如 STL(标准模板库)。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;  // Kids, do not try this at home

int main() 
    cout << "Welcome! How many Pokemon do you own?" << endl;
    int num = 0;
    cin >> num;
    cout << "Ok, enter the names!" << endl;
    std::vector<std::string> names(num);
    for (auto &name: names) 
        cin >> name;
    

    std::sort(names.begin(), names.end());

    cout << "Thanks, here are the pokemon you entered: ";
    for (auto name: names) 
        cout << name << " ";
    
    cout << endl;
    return 0;

【讨论】:

很好,我一定要练习向量算法!【参考方案2】:

好的,我给你一个简单明了的答案,非常容易理解。

    开始使用STL。它将拥有大部分可能随时派上用场的预编译功能。 不要使用#include&lt;iostream&gt;,而是使用#include&lt;bits/stdc++.h&gt;

现在回答您的问题,我将调整您的代码,使其更简单,更易于理解。

#include <bits/stdc++.h>//read the link that I provided above
using namespace std;

void sortArray(string names[],int num)

  sort(names,names+num);//This is the function of the  STL  for which I 
  //included <bits/stdc++.h>.Read from link provided above.
  for(int i=0;i<num;i++)
  
    cout<<names[i]<<endl;
  

   int main()

  cout<<"Welcome! How many Pokemon do you own?"<<endl;
  int num = 0;
  cin >> num;
  cout<< "Ok, enter the names!"<<endl;
  string names[num];
  for(int i=0;i<num;i++)
  
    cin>>names[i];
  
  cout<<"Thanks, here are the pokemon you entered:"<<endl;  
  sortArray(names,num);

如果你有什么不明白的地方请告诉我。

【讨论】:

我还没有进入主题向量,无论如何谢谢rajat! (: &lt;bits/stdc++.h&gt;是什么以及在哪里 @Raul747 bro 我在这里没有使用向量,我只是使用sort() 按字母顺序对数组进行排序。您也可以使用sort() 对任何内容进行排序,无论是整数、浮点数还是任何数据类型。只需使用sort(arrayname,arrayname+sizeof(array)) @JiveDadson &lt;bits/stdc++.h&gt; 基本上包含所有库,因此您不必包含任何其他额外的#include&lt;&gt;。它只是让我们的生活更简单。 @rajat 抱歉,该评论是针对其他帖子的,顺便感谢您的 cmets,谢谢!【参考方案3】:

//明白了!!!!

#include <iostream>
using namespace std;

int findFirst(string *x, int start, int end)

    int first = start;
    for(int i=start; i <= end; i++)
    
        if(x[i] < x[first])
        
            first = i;
        
    
    return first;

/*
void swap(string &s1, string &s2) 
   string temp = s1;
   s1 = s2;
   s2 = temp;

*/
void sortArray(string *items, int start, int end)

    for(int i=start; i<=end; i++)
    
        int min = findFirst(items,i, end);
        swap(items[i], items[min]);
    



int main()

    cout<<"Welcome! How many Pokemon do you own?"<<endl;
    int num = 0;
    cin >> num;

    cout<< "Ok, enter the names!"<<endl;
    string *names = new string[num];
    for(int i=0; i<num; i++)
    
        cin>>names[i];
    
    sortArray(names, 0, num-1);
    cout<<"Thanks, here are the pokemon you entered: ";
    for(int i=0; i<num; i++)
    
        cout << names[i] << " ";
    
    cout << endl;


    return 0;

【讨论】:

内存泄漏。使用newnew[] 退出。使用std::vector&lt;std::string&gt;&gt; 这很可能是一个学校作业,所以我们不能指望 OP 不使用 new 并使用向量。如果有内存泄漏,那么我们应该提醒他释放分配的内存,而不是使用vector。 user3437460 是正确的,我 16 岁做练习题,我在网上找到了。 你是对的,下次我一定要注意内存泄漏,谢谢!

以上是关于对字符串指针数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 qsort 对结构指针数组进行排序

对指针数组进行排序

c语言指针数组排序?

如何根据它们指向的值对双指针数组进行排序?

运行后删除指向已排序字符串数组的指针会给我一个错误[关闭]

冒泡排序——用指针实现