忽略swap函数的重载。

4

我为我的类重载了交换函数,就像这个回答中所示,但是在排序(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));
}

此外,还提供了可执行示例,请点击这里


1
你的 swap 函数似乎被正确地从 std 命名空间内调用。也许它并没有被 std::sort 使用。 - user7860670
@MiroslavVitkov 不确定你的意思是什么? - Criss
1
你确定 std::swap 被调用了吗?另外,你到底想做什么? - txtechhelp
实际上,在Jodocus的回答之后,我不确定,显然也不确定。 - Criss
@txtechhelp 我正在尝试以一种方式对向量进行排序,使得交换元素(交换)不完全是交换,而是稍微有所不同的操作。 - Criss
显示剩余4条评论
1个回答

2
标准规范(§25.4.1.1 [alg.sort])没有明确说明 std::sort 是否保证调用 swap 函数,它仅提到类型必须满足某些概念,但我不会解释它们是否构成了保证:

要求: 随机访问迭代器 必须满足 ValueSwappable 的要求 (17.6.3.2)。*first 的类型必须满足 MoveConstructible (Table 20) 和 MoveAssignable (Table 22) 的要求。

因此,它更多地是依赖于实现而可能会调用 swap,而不是保证会调用。此答案 也提供了一些相关信息。

你可能需要支持你的说法,猜测并不是很好的答案。那篇相关帖子已经有6年的历史了,情况可能已经发生了变化。 - Passer By
证明某些东西不存在是一件棘手的事情。我也无法证明罗素的茶壶不存在。§25.4.1.1 [alg.sort]并没有声明它使用swap,它只需要Swapable。我不会把这个作为证明,而是作为一个迹象,表明sort不一定可以被自定义的swap所替代。 - Jodocus
理想的回答是“标准对std::sort如何交换元素没有任何限制”,这一点可以通过详细查阅标准来证明。 - Passer By

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接