【问题标题】:Ignoring overload of swap function忽略交换函数的重载
【发布时间】:2017-11-04 17:25:48
【问题描述】:

我在this answer 中为我的类重载了交换函数,但在排序时 (std::sort) 编译器仍在使用std::swap。我认为我的方法与链接答案中所述的方法没有任何区别。这是我的代码的复制:

#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>

struct B
{
struct A
{
    friend void swap(A & a, A & b)
    {
        std::swap(a.a, b.a);
        std::cout << "my swap\n";   
    }

    A(int _a) : a(_a) {}
    bool operator<(const A & other) { return a < other.a; }
    int a;
};
};

int main()
{
    std::vector<B::A> v{1, 2, 3, 5, 4};
    std::sort(std::begin(v), std::end(v));
}

还提供了可执行示例here

【问题讨论】:

标签: c++ stl


【解决方案1】:

该标准没有在其规范(§25.4.1.1 [alg.sort])中说明std::sort 实际上保证调用swap,它只提到该类型必须满足某些我不会的概念' t 解释为保证:

要求: 随机存取迭代器 应满足的要求 价值交换 (17.6.3.2)。这 类型 *第一的 应满足的要求 可移动构造 (表 20)和 移动可分配 (表 22)。

因此,它只是可以调用它,具体取决于实现。 This answer 也可能提供一些相关信息。

【讨论】:

  • 您可能想要支持您的主张,推测并不是一个好的答案。链接的帖子已经 6 岁了,情况可能已经改变。
  • 嗯,证明某事不存在是一件棘手的事情。我也无法证明罗素的茶壶不存在。 § 25.4.1.1 [alg.sort] 没有声明它正在使用swap,它只需要Swapable。我不会将其作为证据,而是表明sort 不一定可以被自定义swap 注入。
  • 理想的答案是“标准对std::sort 交换事物的方式没有任何限制”,这可以通过详尽的标准来证明。
猜你喜欢
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多