【问题标题】:should I use the algorithm or hand-code it in this case?在这种情况下我应该使用算法还是手动编码?
【发布时间】:2010-10-17 15:15:08
【问题描述】:

好的,有人告诉我哪个更好。我需要 |= 一个向量的元素与另一个向量。也就是说,我想

void orTogether(vector<char>& v1, const vector<char>& v2)
{
    typedef vector<char>::iterator iter;
    for (iter i = v1.begin(), iter j = v2.begin() ; i != v1.end(); ++i, ++j)
        *i |= *j;
}

由于需要处理 2 个集合,我无法使用 for_each。我想我可以做类似的事情

struct BitWiseOr
{
    char operator()(const char& a, const char& b) {return a | b;}
};

void orTogether2(vector<char>& v1, const vector<char>& v2)
{
    transform(v1.begin(), v1.end(), v2.begin(), 
        v1.begin(), BitwiseOr());
}

这是一个更有效的解决方案,即使顶部已经到位,但底部是分配?这正好在处理循环的中间,我需要尽可能快的代码。

编辑:为 BitwiseOr 添加(很明显?)代码。另外,我在不相关的事情上得到了很多 cmets,比如检查 v2 的长度和更改名称。这只是一个例子,实际代码更复杂。

好吧,我对两者都进行了介绍。 orTogether2 比 orTogether 快得多,所以我将使用 transform 方法。我很惊讶,orTogether2 在 MSVC9 发布模式下快了大约 4 倍。我运行了两次,第二次更改了顺序以确保它不是某种缓存问题,而是相同的结果。谢谢大家的帮助。

【问题讨论】:

  • 这可能 99% 是不必要的,但检查 j != v2.end() 并不是世界上最糟糕的事情(实际上,我更喜欢 '>' 的模式而不是比'!=',但你明白了)

标签: c++ algorithm stl transform


【解决方案1】:

在我们了解MyBitwiseOrObject 是如何实现之前,确实没有太多选择。为什么不进行一些测试?

这里transform 的问题是你需要有一个单独的函子并在命名空间范围内定义它(远离它的使用位置)。 Lambda 解决了这个问题——你可能想看看 Boost Lambda Library。

【讨论】:

    【解决方案2】:

    底部的将编译为与第一个有效的相同,您的 OR 函子肯定会被内联。因此,如果您需要添加更多灵活性或调试框架或其他任何东西,第二个习惯用法会更加灵活。

    由于第一个没有好处,请使用变换方法。一旦你养成了这种习惯,你甚至会停止考虑所有应用程序的显式循环选择,因为它是不必要的。第一种方法的唯一优点是更容易向更熟悉原始 C 的初学者 C++ 程序员解释。

    【讨论】:

    • 我建议将 BitWiseOr 设为模板。 +1。
    【解决方案3】:

    拿起你的手表并测量

    【讨论】:

      【解决方案4】:

      您是否在进行预优化?你知道一个比另一个快吗?我怀疑它们非常接近相同。

      也就是说,我会使用转换。让经过良好测试的库完成繁重的工作。保持你的代码简洁干净。您可能不知道 for-each 中到底发生了什么,但您可以相信库设计者做得很好。

      【讨论】:

        【解决方案5】:

        STL提供的算法可以假设为

        1. 正确
        2. 实施速度相当快
        3. 具有执行复杂性保证(如果标准指定)

        因此,使用它们不会出错。事实上,STL 实现者可能能够专门使用基于模板规范的更快的实现来解决一些问题。

        【讨论】:

          猜你喜欢
          • 2019-01-20
          • 1970-01-01
          • 1970-01-01
          • 2018-04-02
          • 2017-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-04
          相关资源
          最近更新 更多