C++ 对包含整数和字符的字符串数组进行排序

C++ 对包含整数和字符的字符串数组进行排序,c++,arrays,sorting,C++,Arrays,Sorting,我从一个文件中读取了5个元素 我的文件//H4,C8,HJ,C9,D10,D5,DK,D2,S7,DJ,SK,H3,H6 顺便说一句,这些是纸牌。我忽略了第一个字符 我的前5个排序列表应该是这样的——HJ、D10、C9、C8、H4 while(getline(inputFile, val, ',')) { stringstream ss(val); while(ss.good() && i < 5) { ss >> myA

我从一个文件中读取了5个元素

  • 我的文件//H4,C8,HJ,C9,D10,D5,DK,D2,S7,DJ,SK,H3,H6

  • 顺便说一句,这些是纸牌。我忽略了第一个字符
  • 我的前5个排序列表应该是这样的——HJ、D10、C9、C8、H4

    while(getline(inputFile, val, ','))
    {
        stringstream ss(val);
        while(ss.good() && i < 5)
        {
            ss >> myArray[i];
            i++;
    
        }
    
    while(getline(inputFile,val,,'))
    {
    弦流ss(val);
    而(ss.good()&&i<5)
    {
    ss>>myArray[i];
    i++;
    }
    
  • 如何按升序对数组排序

  • 或者在数组中存储数据字符串之前需要排序吗

  • 您可以使用std::sort with vectors(您可以阅读更多)

    它采用如下数组作为输入:


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

    下面是一个小示例,说明如何对卡片进行排序(您还必须考虑错误处理,但没有实现它):

    #包括
    #包括
    使用名称空间std;
    int getCardRange(常量标准::字符串和卡)
    {
    交换机(卡[1])
    {
    案例“2”:返回2;
    案例“3”:返回3;
    案例“4”:返回4;
    案例“5”:返回5;
    案例“6”:返回6;
    案例“7”:返回7;
    案例“8”:返回8;
    案例“9”:返回9;
    案例“1”:返回10;
    案例“J”:返回11;
    案例“Q”:返回12;
    案例“K”:返回13;
    案例“A”:返回14;
    }
    返回-1;//错误
    }
    布尔比较(常数std::string&a,常数std::string&b)
    {
    返回getCardRange(a)>getCardRange(b);
    }
    int main()
    {
    std::string myArray[13]={“H4”、“C8”、“HJ”、“C9”、“D10”、“D5”、“DK”、“D2”、“S7”、“DJ”、“SK”、“H3”、“H6”};
    //使用lambda表达式进行排序
    std::sort(std::begin(myArray)、std::end(myArray)、compare);
    用于(自动卡:myArray)
    {
    
    std::cout您必须使用vector或array。如果不允许使用vector,请首先读取数组并计算项目数(
    count
    )来创建数组。根据该大小创建数组,然后再次读取文件并设置数组项:

    string str;
    int count = 0;
    while(getline(file, str, ','))
        count++;
    
    string *sarray = new string[count];
    
    file.clear();
    file.seekg(0, ios::beg);
    int i = 0;
    while(getline(file, str, ','))
    {
        //trim spaces if any
        str.erase(0, str.find_first_not_of(' '));
        str.erase(str.find_last_not_of(' ') + 1);
    
        sarray[i] = str;
        i++;
        if(i == count)
            break;
    }
    
    要对值进行排序,请将字符串分为两部分。例如,将H4分为
    H
    4
    。然后运行比较。以下使用lambda排序。可能您希望将其更改为与另一个答案类似的内容

    std::sort(sarray, sarray + count, [](string a, string b)
    {
        //save the first character
        char chA = a[0];
        char chB = b[0];
    
        //remove the first character
        a.erase(0, 1);
        b.erase(0, 1);
    
        if(a == "J") a = "11";
        if(a == "Q") a = "12";
        if(a == "K") a = "13";
        if(a == "A") a = "14";
    
        if(b == "J") b = "11";
        if(b == "Q") b = "12";
        if(b == "K") b = "13";
        if(b == "A") b = "14";
    
        //convert to integer
        int v1 = stoi(a);
        int v2 = stoi(b);
    
        //if the two cards have the same values...
        if(v2 == v1) return chA > chB;
    
        return v1 > v2;
    });
    
    清理:

    delete[]sarray;
    

    注意,您可能希望为
    stoi

    A添加异常处理。使用向量B。使用不适用于您?我不应该使用向量..-scohe001。@user8515431“我不应该使用向量。”=8O为什么??不用担心,不管怎样,
    std::sort
    都会起作用。在这个问题中加入分配限制是个好主意。否则,你会积累大量的“只使用
    std::XYZ
    ”答案。请注意,在现实世界中,它们通常是正确的答案,但它们对作为学生的您并没有多大用处。只是看到您不能使用
    std::sort
    。在这种情况下,我认为在修剪第一个字符后,您可以为字母指定一个值J=11,以此类推,然后再对数字进行升序或降序排序g order.array没有
    begin()
    end()
    函数。但是有
    std::begin()
    std::end()
    函数。是的,我的意思是他可以将它与向量一起使用。我不能使用向量。还有其他方法对我的字符串数组排序吗?谢谢你可以使用
    std::sort())
    使用任何随机访问迭代器,其中包括指向数组的指针,例如:
    int-myArray[5];std::sort(myArray,myArray+5);
    在C++11及更高版本中,
    std::begin()
    std::end()
    对固定数组重载:
    std::sort(std::begin(myArray),std::end(myArray));
    delete[]sarray;