如何订购给定的字符串?

时间:2019-01-21 12:26:29

标签: c++

我必须制定可以按字典顺序排列给定字符串的算法。 酸苹果香蕉收购猫作物螃蟹电力猫 ->酸获得苹果香蕉猫猫螃蟹的作物力 像这样...

index.php

我的想法是将给定字符串的每个字母更改为数字,例如a-> 1 b-> 2,... z-> 26; 然后,从第一个字母开始,它将比较数字的顺序... 再一次,我将数字改为字母。但是它的输出是错误的... 我认为这看起来没错...哪里错了?在此处输入代码

3 个答案:

答案 0 :(得分:1)

std::sort允许对STL中的所有合适容器进行轻松排序,例如std::liststd::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;
}

这将返回

A
Z
a
aaa
dg
egseg
xyyyyyy
xyz
z

请注意,smaller_than在此处可以具有不同的代码,使您可以根据需要调整比较。

如果省略smaller_than,则表示您写

    sort(data.begin(), data.end());

它将使用当前排序类型的<运算符,在这种情况下为string::operator<。在此示例中,此操作应相同(尽管未进行准确检查),但我想包含这样的函数以提供给您方便的工具。例如,如果您希望苹果,斑马和斑马的顺序不是“斑马,苹果,斑马”而是“苹果,斑马,斑马”,则可以相应地修改比较功能。

关于您的代码的一些提示:

  • 学习使用STL,char数组几乎是C。在C ++中,您使用某种字符串类,例如std::string,或某种其他库的类,例如{{1} }。

  • 将您的代码划分为某种模块,例如函数。您甚至可以在C风格的过程编程中执行此操作。现在,您有一堆for循环,这些循环会执行需要仔细阅读的操作,而不是附加名称。

答案 1 :(得分:0)

实现此目标的最佳方法是使用向量,排序和字符串。您可以在向量中输入字符串,如下所示:

string s;
vector<string> v;
while (cin >> s)
    v.push_back(s);

然后使用以下命令进行排序:

sort(v.begin(), v.end());

答案 2 :(得分:0)

在C ++中,您只能使用内置的std::sort函数,但是所有字符串必须仅包含小写/大写字母。您可以将值存储在某些STL容器上,例如std::vector,然后使用std::sortbegin()迭代器调用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;
}