【问题标题】:C++ how to sort dynamically using lambda functions for a vector of unique_ptrs?C ++如何使用lambda函数对unique_ptrs向量进行动态排序?
【发布时间】:2011-09-20 16:57:54
【问题描述】:

所以我有一个std::vector<std::unique_ptr<Base>> vec 并且我正在尝试对其进行动态排序,因为 Derived1 与 Derivedn 之间存在逻辑比较(Derivedn 始终 > Derivedn-1 > ... > Derived1)(例如 n = 10 或所以)并且每个 Derivedx 与 Derivedx 都有自己不同的比较。例如,考虑 10 位整数 > 9 位整数 > 1 位整数,但在每个派生类中 53 > 32(但我没有对整数进行排序)。

所以我可以这样做:

std::sort(vec.begin(), vec.end(), 
[](std::unique_ptr<Base>& const a, std::unique_ptr<Base>& const b){
  return *a<*b;}

然后在 Base 中,有一个函数 Base::operator&lt;(const Base&amp; b) 进行比较,如果它们是不同的派生类,如果它们相同则转换为 Derivedx,如果它们是相同的派生类,则与 Derivedx::operator&lt;(const Derivedx&amp; d) 进行比较。

但是,我认为有一种方法可以根据派生类中的适当定义自动比较 a 和 b,但由于编译错误,我无法实现它。我无法让 lambda 函数动态比较 Derivedx

我试过Base::operator&lt;(const std::unique_ptr&lt;Base&gt;),然后使用return *a&lt;b 编译器错误,说我使用了删除的复制赋值运算符(我不明白,赋值在哪里??)。一个抽象的虚拟 Base::operator&lt;(const Base&amp; b) 实际上与我现在正在做的事情相同,但需要更多的工作,因为我必须实现 Derivedx::operator&lt;(const Base&amp; b)(对于每个 Derivedx),然后如果它们相同,则转换为 (Derivedx)。

我比较基类中的所有内容可能会更好,而不是在(n 个派生类中的 n 个比较)中实现 n^2 比较。但我确实想看看我是否可以保持“面向对象”。

对设计问题有什么想法吗?
谢谢。

【问题讨论】:

  • 如果多方法提案能融入语言就好了。

标签: sorting lambda c++11 unique-ptr


【解决方案1】:

看看 Scott Meyers 中的第 31 章,使函数对多个对象进行虚拟化更有效的 C++

另外,请尝试搜索短语 double dispatchmultiple dispatch

【讨论】:

    【解决方案2】:

    嗯...我可能会用一组相关变体覆盖operator&lt;。这将独立于任何类层次结构。但也许这不是你想要的。

    【讨论】:

      猜你喜欢
      • 2011-10-15
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多