C++ 如何对给定字符串排序?
我必须做一个算法,可以按照字典顺序排列给定的字符串。 酸苹果香蕉收购猫作物蟹粉猫 ->酸获取苹果香蕉猫螃蟹作物动力 像这样C++ 如何对给定字符串排序?,c++,C++,我必须做一个算法,可以按照字典顺序排列给定的字符串。 酸苹果香蕉收购猫作物蟹粉猫 ->酸获取苹果香蕉猫螃蟹作物动力 像这样 #include <stdio.h> int main() { int n; scanf("%d",&n); char word[n][100]; int change[n][100]; char alphabet[]="abcdefghijklmnopqrstuvwxyz"; for(int i=0;i<n;i++){
#include <stdio.h>
int main() {
int n;
scanf("%d",&n);
char word[n][100];
int change[n][100];
char alphabet[]="abcdefghijklmnopqrstuvwxyz";
for(int i=0;i<n;i++){
scanf("%s",&word[i]);
}
for(int i=0;i<n;i++){
for(int j=0;j<100;j++){
change[i][j]=0;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<100;j++){
for(int k=0;k<=26;k++){
if(word[i][j]==alphabet[k]){
change[i][j]=k+1;
}
}
if(word[i][j]=='\0'){
for(int k=j+1;k<100;k++){
change[i][k]=0;
}
}
}
}
for(int i=0;i<n-1;i++){
for(int j=0;j<100;j++){
if(change[i][j]>change[i+1][j]){
int temp[100];
for(int k=0;k<100;k++){
temp[k]=change[i][k];
}
for(int k=0;k<100;k++){
change[i][k]=change[i+1][k];
}
for(int k=0;k<100;k++){
change[i+1][k]=temp[k];
}
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<100;j++){
for(int k=1;k<=27;k++){
if(change[i][j]==k){
word[i][j]=alphabet[k-1];
}
}
}
}
for(int i=0;i<n;i++){
printf("%s\n",word[i]);
}
return 0;
}
#包括
int main(){
int n;
scanf(“%d”和“&n”);
字符字[n][100];
整数变化[n][100];
字符字母[]=“abcdefghijklmnopqrstuvwxyz”;
对于(int i=0;i实现这一点的最佳方法是使用向量、排序和字符串。您可以在向量中输入字符串,如图所示:
string s;
vector<string> v;
while (cin >> s)
v.push_back(s);
std::sort
允许从STL轻松对任何配件容器进行排序,如std::list
或std::vector
。您可以为其提供一个函数,该函数定义一个小于的关系,用于比较它们
例如:
#include <string>
using std::string;
#include <vector>
using std::vector;
#include <algorithm>
using std::sort;
using std::min;
#include <iostream>
using std::cout;
using std::endl;
bool smaller_than(const string& a, const string& b)
{
for(size_t i=0; i<min(a.length(), b.length()); i++)
{
if(a[i] < b[i]) return true;
if(a[i] > b[i]) return false;
}
return a.length() < b.length();
}
int main()
{
vector<string> data = {"xyz", "aaa", "dg", "egseg", "xyyyyyy", "a", "z", "A", "Z" };
sort(data.begin(), data.end(), smaller_than);
for(const string& datum : data)
{
cout << datum << endl;
}
return 0;
}
请注意,小于的在这里可以有不同的代码,允许您根据需要调整比较
如果省略比
小的,那就是你写的
sort(data.begin(), data.end());
使用当前排序的类型的<运算符,在这种情况下, String::C++中的运算符< P>可以使用内置的代码> STD::排序函数,但是所有字符串只能包含小/大写字母。可以将值存储在某个STL容器上,例如“代码> STD::vector < /代码>,然后调用<代码> STD::排序< /代码)>使用begin()
和end()
迭代器
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
int n;
std::cin >> n;
std::vector<std::string> v;
while (n--) {
std::string s;
std::cin >> s;
v.push_back(s);
}
std::sort(v.begin(), v.end());
for(auto it : v ) std::cout << it << std::endl;
}
#包括
#包括
#包括
int main(){
int n;
标准:cin>>n;
std::向量v;
而(n--){
std::字符串s;
标准:cin>>s;
v、 推回;
}
排序(v.begin(),v.end());
对于(auto-it:v)std::cout有什么理由不使用std::string
和std::vector
?因为如果你这样做,排序只是调用相应的算法(std::sort
,你也可以将它用于c字符串和c数组,只是有点痛苦)C++没有,所以技术上你的代码不是有效的C++。你的改变算法不起作用,<代码> 'Z' + 1 不是一个字母。查凯撒密码。你可能想要:<代码> char c=((变化[i](j'-' a))+%)26)+'a';
也许值得一提的是,小于的对于OPs需求是不必要的。字符串根据它们的字典顺序进行比较,std::sort
默认使用该比较。我不明白。当std::string
重载了操作符@u时,为什么需要编写比较函数ser463035818我主要是想给他这个选项作为他路上的工具。另外,请注意我是如何强调“Z”<“a”?这是正确的顺序,但看到像“Zebra,apple,Zebra”这样的顺序可能会违反直觉。这一部分本身并不是回答问题所必需的,但我觉得它属于它。但我添加这一部分是为了澄清。@ThomasMatthews看到了我上面的评论。思考一下:sort
是否可以处理包含所有大写字符的字符串?我相信会的。
sort(data.begin(), data.end());
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
int n;
std::cin >> n;
std::vector<std::string> v;
while (n--) {
std::string s;
std::cin >> s;
v.push_back(s);
}
std::sort(v.begin(), v.end());
for(auto it : v ) std::cout << it << std::endl;
}