在下面的代码中,在二进制谓词函数mycomparison中,为什么首先从L2(即2.1)而不是L1(1.4)中获取第一项?同样,第二个是从L1获取第一个项目。并且此行为特定于此功能(合并)还是可以扩展到其他功能。我们是否可以假设容器的顺序将确定传递给二进制谓词函数的顺序?

#include <iostream>
#include <list>
bool mycomparison(double first, double second)
{
    std::cout <<"first "<< first << " " << "second "<< second << "\n";
    return (int (first) <  int (second) );
}

int main()
{
    std::list<double> L1, L2;
    L1.push_back(3.1); L1.push_back(2.2); L1.push_back(2.9);
    L2.push_back(3.7); L2.push_back(7.1); L2.push_back(1.4);
    L1.sort(); L2.sort();
    L1.merge(L2);

    std::cout << "L1 contains: ";
    for (std::list<double>::iterator it = L1.begin(); it != L1.end(); ++it)
        std::cout << *it << ",  ";
    std::cout << '\n';

    L2.push_back(2.1);
    L2.push_back(3.2);

    std::cout << "L2 contains: ";
    for (std::list<double>::iterator it = L2.begin(); it != L2.end(); ++it)
        std::cout << *it << ",  ";
    std::cout << '\n';

    L1.merge(L2, mycomparison);

    std::cout << "L1 contains: ";
    for (std::list<double>::iterator it = L1.begin(); it != L1.end(); ++it)
        std::cout << *it << ",  ";
    std::cout << '\n';
    return 0;
}

输出量
L1 contains: 1.4,  2.2,  2.9,  3.1,  3.7,  7.1,
L2 contains: 2.1,  3.2,
first 2.1 second 1.4
first 2.1 second 2.2
first 2.1 second 2.9
first 2.1 second 3.1
first 3.2 second 3.1
first 3.2 second 3.7
first 3.2 second 7.1
L1 contains: 1.4,  2.2,  2.9,  2.1,  3.1,  3.7,  3.2,  7.1,

这是一个使用二进制谓词或Compare的排序函数。但是,传递给函数的项目也“不按顺序排列”。在myfunction变量中,我将获得 vector (71)中的第二项而不是第一项(32)。为什么?
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector

bool myfunction(int i, int j) {
    std::cout << i << " " <<j<<"\n" ;
    return (i<j); }

int main() {
    int myints[] = { 32,71,12,45 };
    std::vector<int> myvector(myints, myints + 4);

    std::sort(myvector.begin(), myvector.end(), myfunction);

    std::cout << "myvector contains:";
    for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)
        std::cout << ' ' << *it;
    std::cout << '\n';

    return 0;
}

输出量
71 32
71 32
12 32
45 12
45 71
45 32
myvector contains: 12 32 45 71

最佳答案

Strict Weak Ordering(例如您用mycomparison函数定义的那个)中,两个对象可能不相等但“等效”。在您的情况下,由于mycomparison(2.2, 2.1)mycomparison(2.1, 2.2)均为假,因此2.12.2的编号在该顺序中是等效的。

因此,实际上L1的最终顺序是根据mycomparison的顺序排序的,因为2.22.92.1都被认为是等效的。另外, std::list::merge 保证*this中已经存在的元素(2.22.9)位于从参数列表(2.1)移出的等效元素之前。您可以看到这种行为也得到遵守。

关于c++ - 二进制谓词如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46218053/

10-13 08:34