c++ - 按字母顺序排序结构数组
问题描述
我有一个名为 Sheep 的结构数组 (A[#])(因为我的任务是关于羊 DNR)。在我完成任务要求的任何事情之后,我只剩下这个结构:
struct Sheep
{
string Vardas;
char Fragmentas[CMax];
int atitikme = 0;
};
在我的里面,数据是:
(string Vardas) | (char Fragmentas[CMax]) | (int atitikme)
Baltukas TAGCTT 3
Bailioji ATGCAA 3
Smarkuolis AATGAA 1
(char Fragmentas[CMax] 不会使用,所以你不必看它,我只是为了清楚起见而命名它)。
所有这些数据都来自 U2.txt 文件,不能手动输入代码。
剩下要做的就是按照以下规则对其进行排序:
- 'int atitikme' 从大到小。
- 如果 '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];
}
}
}
}
n = 4 | 米 = 6
我需要如何/什么添加到此代码中才能使其生效:
else if (A[p].atitikme == A[o].atitikme)
{
<code>
}
如果 'atitikme' 是 == 另一个 'atitikme' 则 A[p].Vardas 和 A[o].Vardas 必须按字母顺序排序。但只有整个阵列中的 2 个。
或者,如果它太难理解我的意思,任何人都可以在答案框中发布代码,它是否会在 2 个字符串之间按字母顺序排序?
注意:整行数据
(string Vardas) (char Fragmentas[CMax]) (int atitikme)
必须保持不变,只有行中的位置必须不同,并按照我之前提到的那些规则进行排序。
输出应该是:
Bailioji 3
Baltukas 3
Smarkuolis 1
编辑:我当前的输出是:
Baltukas 3
Bailioji 3
Smarkuolis 1
附言。该任务允许使用它的 C++ 的所有内容,并且不必创建或读取任何其他文件。
解决方案
在这里,我使用std::vector<>
而不是数组来存储羊。其次,使用std::sort()
and 一个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;
}
输出:
Bailioji 3
Baltukas 3
Kmarkuolis 2
Hmarkuolis 1
Smarkuolis 1