Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何对给定字符串排序?_C++ - Fatal编程技术网

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;
}