有没有办法避免具有实现QSort的全局变量
Is there a way to avoid having global variable to implement qsort
我有一个带有一个.h
文件和多个.cpp
文件的项目。标题文件包含一个命名空间UF
(> u seful f f Unctions的缩写)当前实现排序。
这是通过在UF.cpp
中定义的比较器来完成的:
int compar_int_asc(const void *a, const void *b)
{
int aa = *((int *)a), bb = *((int *)b);
if (base_arr_int[aa] < base_arr_int[bb])
return -1;
if (base_arr_int[aa] == base_arr_int[bb])
return 0;
if (base_arr_int[aa] > base_arr_int[bb])
return 1;
}
目前,qsort
需要访问的基本数组base_arr_int
和上面的比较函数在main.cpp
中声明并在UF.cpp
中进行外观。
i在其他类中访问qsort
,SEP
如下。首先,在SEP.cpp
中,我extern base_arr_int
。然后,如果ratios[100]
是一个本地且对SEP
本地的整数数组,则在SEP.cpp
中进行以下操作。
base_arr_int = ratios;
qsort(indices, 100, sizeof(int), UF::compar_int_asc);
这是通过多个类实施QSort的最佳方法?
特别是,我想尽可能避免使用main.cpp
中定义的全局变量。有其他设计吗?
全局变量的目的是将数组形象放置在自定义比较器中。为了消除全局变量,让我们从字面上将ratio
放入自定义比较器中。为此,自定义比较器不能是普通功能指针。它需要是函数对象。和std::sort
支持。
让我们逐步进行。
所以,您有一个存储东西的数组。
int ratio[5] = {300, 400, 200, 500, 100};
,但您不想直接对其进行排序。您可以创建一个真正被分类的Indice数组。
int indice[5] = {0, 1, 2, 3, 4};
目标是对indice
进行排序。所以让我们写:
std::sort(indice, indice + 5);
但这还不是您想要的。您还需要传递自定义比较器index_comp
,因为默认的比较少于比较器不是您需要的。
std::sort(indice, indice + 5, index_comp);
其余工作是如何编写index_comp
。实际上很简单:lambda表达
auto index_comp = [&ratio](int index_left, int index_right) { return ratio[index_left] < ratio[index_right]; };
此lambda表达式通过参考([&ratio]
)捕获数组ratio
。它具有一个参数列表,其中有两个Indice。身体比较了ratio
中的两个实际对象。
如果您喜欢旧学校的方式,则lambda表达只是以下语法:
class Compiler_Generated_Name
{
private:
int (&ratio)[5];
public:
Compiler_Generated_Name(int (&ratio_)[5]) : ratio(ratio_) {}
bool operator()(int index_left, int index_right)
{
return ratio[index_left] < ratio[index_right];
}
};
Compiler_Generated_Name index_comp(ratio);
整个代码:
#include <iostream>
#include <algorithm>
int main()
{
int ratio[5] = {300, 400, 200, 500, 100};
int indice[5] = {0, 1, 2, 3, 4};
auto index_comp = [&ratio](int index_left, int index_right) { return ratio[index_left] < ratio[index_right]; };
std::sort(indice, indice + 5, index_comp);
for (int i = 0; i < 5; ++i)
std::cout << ratio[indice[i]] << ' ';
}
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 有没有办法避免具有实现QSort的全局变量
- 根据 std::sort() 实现 qsort()