在下面的代码中,在二进制谓词函数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.1
和2.2
的编号在该顺序中是等效的。
因此,实际上L1
的最终顺序是根据mycomparison
的顺序排序的,因为2.2
,2.9
和2.1
都被认为是等效的。另外, std::list::merge
保证*this
中已经存在的元素(2.2
和2.9
)位于从参数列表(2.1
)移出的等效元素之前。您可以看到这种行为也得到遵守。
关于c++ - 二进制谓词如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46218053/