按字母顺序对结构数组进行排序

Lit*_*ith 4 c++ sorting algorithm stdvector c++11

我有一个名为Sheep的结构数组(A [#])(因为我的任务是关于绵羊DNR).在我做任何要求的任务后,我留下了这个结构:

struct Sheep 
{
    string Vardas;
    char Fragmentas[CMax]; 
    int atitikme = 0; 
};
Run Code Online (Sandbox Code Playgroud)

在我的内部,数据是:

(string Vardas) | (char Fragmentas[CMax]) | (int atitikme)
Baltukas   TAGCTT 3
Bailioji   ATGCAA 3 
Smarkuolis AATGAA 1 
Run Code Online (Sandbox Code Playgroud)

(char Fragmentas [CMax]将不会使用,所以你不必看它,我只是将它命名为明确).

所有这些数据都来自U2.txt文件,无法在代码中手动输入.

它剩下要做的就是按照这些规则对它进行排序:

  1. 它通过'int atitikme'从大到小.
  2. 如果'int atitikme'相等,那么它必须按'A [#]排序.Vardas按字母顺序排列.

要通过'int atitikme'对其进行排序,我创建了一个代码:

string q;
char w[20];
int e;
for (int o = 0; o < n-1; o++) 
{
    for (int p = o+1; p < n-1; p++) 
    {
        if (A[p].atitikme > A[o].atitikme) 
        {
            // - Vardo Keitimas
            q = A[o].Vardas;
            A[o].Vardas = A[p].Vardas;
            A[p].Vardas = q;
            // - A[#].atitikme keitimas
            e = A[o].atitikme;
            A[o].atitikme = A[p].atitikme;
            A[p].atitikme = e;
            // - DNR farkmentu keitimas
            for (int r = 0; r < m; r++) 
            {
                w[r] = A[o].Fragmentas[r];
                A[o].Fragmentas[r] = A[p].Fragmentas[r];
                A[p].Fragmentas[r] = w[r];
             }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

n = 4 | m = 6

如何/我需要添加到此代码中以使其成为现实:

else if (A[p].atitikme == A[o].atitikme) 
{
    <code>
}
Run Code Online (Sandbox Code Playgroud)

如果'atitikme'= =另一个'atitikme'那么A [p] .Vardas和A [o] .Vardas必须按字母顺序排序.但只有整个阵列中的那两个.

或者,如果它太难理解我的意思,任何人都可以在答案框中发布代码,是否会在2个字符串之间按字母顺序排序?

注意:整行数据

(字符串Vardas)(char Fragmentas [CMax])(int atitikme)

必须保持不变,只有行中的地方必须是不同的,并按我之前提到的那些规则排序.

输出应该是:

Bailioji   3
Baltukas   3
Smarkuolis 1
Run Code Online (Sandbox Code Playgroud)

编辑:我目前的输出是:

Baltukas   3
Bailioji   3
Smarkuolis 1
Run Code Online (Sandbox Code Playgroud)

Ps.该任务允许使用所有内容,只要它的C++,而不必创建或读取任何其他文件.

JeJ*_*eJo 5

在这里,我用std::vector<>而不是数组来存储羊.其次,使用std::sort()lambda函数,您可以轻松提到如何对std::vector<>/中的元素进行排序Sheeps.这将是最简单的方法.

以下是实时代码,以供审核:https://www.ideone.com/ay7TWU

#include <iostream>
#include <vector>
#include <algorithm>

struct Sheep
{
   std::string Vardas;
   std::vector<char> Fragmentas;
   int atitikme;
};

int main()
{
  std::vector<Sheep> vec =
   {
      {"Baltukas",  {'T','A','G','C','T','T'}, 3},
      {"Bailioji",  {'A','T','G','C','A','A'}, 3},
      {"Smarkuolis",{'A','A','T','G','A','A'}, 1},
      {"Hmarkuolis",{'A','A','T','G','A','A'}, 1},
      {"Kmarkuolis",{'A','A','T','G','A','A'}, 2}
   };

   std::sort(vec.begin(), vec.end(), [](const Sheep& lhs, const Sheep& rhs)
      {
         return (lhs.atitikme == rhs.atitikme) ? 
            lhs.Vardas < rhs.Vardas: // if atitikme's of sheeps are equal
            lhs.atitikme > rhs.atitikme; // if atitikme's of sheeps are not equal
      });

    for (const auto& it: vec)
        std::cout << it.Vardas << " " << it.atitikme << "\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Bailioji 3
Baltukas 3
Kmarkuolis 2
Hmarkuolis 1
Smarkuolis 1
Run Code Online (Sandbox Code Playgroud)