按字母顺序排序结构数组
Sort structure array in alphabetical order
我有一个名为 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 文件,无法手动输入代码。
剩下要做的就是按照这些规则对其进行排序:
- It goes from bigger to smaller by 'int atitikme'.
- IF 'int atitikme' is equal then it will have to sort by 'A[#].Vardas in a in alphabetical order.
要按 '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
How/what 我是否需要添加到此代码才能运行:
else if (A[p].atitikme == A[o].atitikme)
{
<code>
}
如果 'atitikme' 是 == 另一个 'atitikme' 那么 A[p].Vardas 和 A[o].Vardas 必须按字母顺序排序。但只有整个数组中的那两个。
或者如果很难理解我的意思,谁能post一个代码,在答案框中,它是否会在 2 个字符串之间按字母顺序排序?
注意:
整行数据
(string Vardas) (char Fragmentas[CMax]) (int atitikme)
必须保持不变,只是行中的位置必须不同,并按照我之前提到的规则排序。
输出应该是:
Bailioji 3
Baltukas 3
Smarkuolis 1
编辑:
我当前的输出是:
Baltukas 3
Bailioji 3
Smarkuolis 1
P.s。该任务允许使用任何东西,只要它的 C++,并且不必创建或读取任何其他文件。
这里我用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;
}
输出:
Bailioji 3
Baltukas 3
Kmarkuolis 2
Hmarkuolis 1
Smarkuolis 1
https://en.cppreference.com/w/cpp/algorithm/sort 向您展示如何使用 std::sort
。
你编写一个函数 bool less_than(const Sheep& a, const Sheep& b)
来表示两只羊的顺序,然后简单地调用 std::sort(container.begin(), container.end(), less_than);
,其中 container
类似于绵羊的向量。
编辑:写出的函数:
bool less_than(const Sheep& a, const Sheep& b)
{
if(a.atitikme != b.atitikme) return a.atitikme < b.atitikme;
return a.Vardas < b.Vardas;
}
最好的办法是一一解决你的问题。
首先 - 定义排序顺序 - 请参阅有关文档 - 例如在 std::less
因此,您需要定义排序顺序的仿函数 class:
class SheepOrder
{
public:
bool operator() ( const Sheep& left, const Sheep& right) const
{
// It goes from bigger to smaller by 'int atitikme'.
if (left.atitikme > right.atitikme)
return true;
if (left.atitikme < right.atitikme)
return false;
//IF 'int atitikme' is equal then it will have to sort it in a in alphabetical order.
// I guess you meant Vardas
return left.Vardas < right.Vardas;
}
};
现在,定义了顺序 - 只需使用 std::sort - 它可以与数组一起使用 - 没问题:
Sheep sheeps[100];
// ..
std::sort(std::begin(sheeps), std::end(sheeps), SheepOrder{});
或:
void sortSheeps(Sheep* array, std::size_t numOFSheeps)
{
std::sort(array, array + numOfSheeps, SheepOrder{});
}
您还可以使用 std::tuple
来更轻松地定义排序顺序(如果元组的元素也具有此运算符,则默认情况下元组具有运算符 <):
class SheepOrder
{
public:
bool operator() ( const Sheep& left, const Sheep& right) const
{
return tieMembersForSorting(left) < tieMembersForSorting(right);
}
private:
static auto tieMembersForSorting( const Sheep& object)
{
return std::make_tuple(-object.atitikme, // - to revert order
std::ref(object.Vardas)); // ref - to not make copy of string
}
};
将 tieMembersForSorting
定义为自由函数 - 也可以使用 lambda(因为它只是一个衬里):
inline auto tieMembersForSorting( const Sheep& object)
{
return std::make_tuple(-object.atitikme, // - to revert order
std::ref(object.Vardas)); // ref - to not make copy of string
}
std::sort(begin(...), end(...), [](Sheep const& left, Sheep const& right)
{ return tieMembersForSorting(left) < tieMembersForSorting(right); });
我有一个名为 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 文件,无法手动输入代码。
剩下要做的就是按照这些规则对其进行排序:
- It goes from bigger to smaller by 'int atitikme'.
- IF 'int atitikme' is equal then it will have to sort by 'A[#].Vardas in a in alphabetical order.
要按 '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
How/what 我是否需要添加到此代码才能运行:
else if (A[p].atitikme == A[o].atitikme)
{
<code>
}
如果 'atitikme' 是 == 另一个 'atitikme' 那么 A[p].Vardas 和 A[o].Vardas 必须按字母顺序排序。但只有整个数组中的那两个。
或者如果很难理解我的意思,谁能post一个代码,在答案框中,它是否会在 2 个字符串之间按字母顺序排序?
注意: 整行数据
(string Vardas) (char Fragmentas[CMax]) (int atitikme)
必须保持不变,只是行中的位置必须不同,并按照我之前提到的规则排序。
输出应该是:
Bailioji 3
Baltukas 3
Smarkuolis 1
编辑: 我当前的输出是:
Baltukas 3
Bailioji 3
Smarkuolis 1
P.s。该任务允许使用任何东西,只要它的 C++,并且不必创建或读取任何其他文件。
这里我用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;
}
输出:
Bailioji 3
Baltukas 3
Kmarkuolis 2
Hmarkuolis 1
Smarkuolis 1
https://en.cppreference.com/w/cpp/algorithm/sort 向您展示如何使用 std::sort
。
你编写一个函数 bool less_than(const Sheep& a, const Sheep& b)
来表示两只羊的顺序,然后简单地调用 std::sort(container.begin(), container.end(), less_than);
,其中 container
类似于绵羊的向量。
编辑:写出的函数:
bool less_than(const Sheep& a, const Sheep& b)
{
if(a.atitikme != b.atitikme) return a.atitikme < b.atitikme;
return a.Vardas < b.Vardas;
}
最好的办法是一一解决你的问题。
首先 - 定义排序顺序 - 请参阅有关文档 - 例如在 std::less
因此,您需要定义排序顺序的仿函数 class:
class SheepOrder
{
public:
bool operator() ( const Sheep& left, const Sheep& right) const
{
// It goes from bigger to smaller by 'int atitikme'.
if (left.atitikme > right.atitikme)
return true;
if (left.atitikme < right.atitikme)
return false;
//IF 'int atitikme' is equal then it will have to sort it in a in alphabetical order.
// I guess you meant Vardas
return left.Vardas < right.Vardas;
}
};
现在,定义了顺序 - 只需使用 std::sort - 它可以与数组一起使用 - 没问题:
Sheep sheeps[100];
// ..
std::sort(std::begin(sheeps), std::end(sheeps), SheepOrder{});
或:
void sortSheeps(Sheep* array, std::size_t numOFSheeps)
{
std::sort(array, array + numOfSheeps, SheepOrder{});
}
您还可以使用 std::tuple
来更轻松地定义排序顺序(如果元组的元素也具有此运算符,则默认情况下元组具有运算符 <):
class SheepOrder
{
public:
bool operator() ( const Sheep& left, const Sheep& right) const
{
return tieMembersForSorting(left) < tieMembersForSorting(right);
}
private:
static auto tieMembersForSorting( const Sheep& object)
{
return std::make_tuple(-object.atitikme, // - to revert order
std::ref(object.Vardas)); // ref - to not make copy of string
}
};
将 tieMembersForSorting
定义为自由函数 - 也可以使用 lambda(因为它只是一个衬里):
inline auto tieMembersForSorting( const Sheep& object)
{
return std::make_tuple(-object.atitikme, // - to revert order
std::ref(object.Vardas)); // ref - to not make copy of string
}
std::sort(begin(...), end(...), [](Sheep const& left, Sheep const& right)
{ return tieMembersForSorting(left) < tieMembersForSorting(right); });