c++ - 使用基于此标志的条件语句是否比添加更多代码行更有效?

标签 c++ sorting conditional-statements bubble-sort flags

我有一个接受 bool 参数的排序函数 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]);
                }
            }
        }
  }
}

Asize是私有(private)数据成员(分别为数组指针和大小)。

最佳答案

为了代码清晰,最好将其设为非成员函数模板并将其传递给比较仿函数。确保将函数放在应用程序的命名空间中,以免与 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.

关于c++ - 使用基于此标志的条件语句是否比添加更多代码行更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57979071/

相关文章:

c++ - 有人可以解释这个 C++ 符号吗?

c++ - 低于 4.5 的 OpenGL 版本的 glBindTextureUnit 的替代方案?

c++ - 等价于 Matlab 的 sum(A)?

java - 使用 PriorityQueue 进行字符串排序的问题 (Java)

sql - Postgresql SQL 根据表 2 中的条件从表 1 中选择项目

java - 如何检查空的二维数组?

C++ vector 初始化

c# - WPF 绑定(bind)到对象集合,按顺序存储在 C# 中的另一个集合中的 ID 排序

eclipse - 按可见性对 Eclipse 中的成员进行排序,无需按字母顺序排序

java - 我无法让我的程序打印出闰年