c++ - 使用基于此标志的条件语句是否比添加更多代码行更有效?
问题描述
我有一个排序函数,它接受一个布尔参数(降序),如果&是一个选择算法的枚举类(这里代码的子集用于(bubblesort))desc
,则它以相反的顺序排序true
algo
algo::BUBBLE
使用这个内联条件语句 ( if (!desc ? A[j] > A[j + 1] : A[j] < A[j + 1])
),我可以避免为反向排序重写整个代码,因为它会根据desc
标志评估适当的条件。但我想知道这是否会产生不必要的开销,因为它反复检查标志 [ (n-1)*(1+2+...+n-1) 次]。对于更大的数据元素,这种开销会很大吗?更多代码还是更多开销?
void Array<T>::sort(bool desc = false, algo a)
{
if (algo == algo::BUBBLE)
{
bool wasSwapped = true;
for (size_t i = 0; i < size - 1 && wasSwapped; i++)
{
switched = false;
for (size_t j = 0; j < size - i - 1; j++)
{
if (!desc ? A[j] > A[j + 1] : A[j] < A[j + 1])
{
wasSwapped = true;
swap(A[j], A[j + 1]);
}
}
}
}
}
A
并且size
是私有数据成员(分别是数组指针和大小)。
解决方案
为了代码清晰起见,最好将其设为非成员函数模板并将其传递给比较函子。确保将函数放在应用程序的命名空间中,这样就不会与命名空间中的同名函数混淆std
。
假设Array<T>::A
是可访问的,
namespace MyApp
{
template <typename T, typename Compare = std::less<T>>
void sort(Array<T>& array, algo a, Compare compare = Compare());
{
if (a == algo::BUBBLE)
{
bool wasSwapped = true;
for (size_t i = 0; i < size - 1 && wasSwapped; i++)
{
switched = false;
for (size_t j = 0; j < size - i - 1; j++)
{
if (!compare(array.A[j], array.A[j + 1]))
{
wasSwapped = true;
swap(array.A[j], array.A[j + 1]);
}
}
}
}
}
}
现在您可以使用:
Array<int> a = { ... };
MyApp::sort(a, algo::BUBBLE); // std::less<int> is the default functor.
MyApp::sort(a, algo::BUBBLE, std::greater<int>()); // Explicit compare functor.
推荐阅读
- react-native - 错误:渲染的钩子比上一次渲染时更多。使用 captureRef 时
- flutter - 当依赖于使用 Flutter/Dart 版本低于 1.0.0 的 git 包时,如何设置版本约束?
- maven - Maven 多个 WSDL/XSD 模块设置
- asp.net - ASPX 页面 - 翻译
- javascript - 获取网络::ERR_SSL_PROTOCOL_ERROR
- javascript - 将 CSS 线性渐变转换为 HTML 引导按钮
- git - 在更大的 Git 存储库中添加上游存储库
- python - 用于发送邮件的 Python 脚本不返回错误但未收到邮件
- javascript - 在渲染后将图像容器宽度与图像宽度匹配 - React
- java - 由于测试阶段权限被拒绝异常,Maven 构建失败