对字符串指针数组进行排序
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<iostream>
,而是使用#include<bits/stdc++.h>
。
现在回答您的问题,我将调整您的代码,使其更简单,更易于理解。
#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! (:<bits/stdc++.h>
是什么以及在哪里
@Raul747 bro 我在这里没有使用向量,我只是使用sort()
按字母顺序对数组进行排序。您也可以使用sort()
对任何内容进行排序,无论是整数、浮点数还是任何数据类型。只需使用sort(arrayname,arrayname+sizeof(array))
。
@JiveDadson <bits/stdc++.h>
基本上包含所有库,因此您不必包含任何其他额外的#include<>
。它只是让我们的生活更简单。
@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;
【讨论】:
内存泄漏。使用new
和new[]
退出。使用std::vector<std::string>>
这很可能是一个学校作业,所以我们不能指望 OP 不使用 new
并使用向量。如果有内存泄漏,那么我们应该提醒他释放分配的内存,而不是使用vector。
user3437460 是正确的,我 16 岁做练习题,我在网上找到了。
你是对的,下次我一定要注意内存泄漏,谢谢!以上是关于对字符串指针数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章