以下y.size()= 4如何? y中的值是{11,2,4,7}如何到达此值?对于集合的每次迭代,operator()函数中的a和b是什么。我不了解y的构造,我无法在网上找到解释这种情况的任何内容。谢谢
#include <iostream>
#include <set>
struct C
{
bool operator()(const int &a, const int &b) const
{
return a % 10 < b % 10;
}
};
int main()
{
std::set<int> x({ 4, 2, 7, 11, 12, 14, 17, 2 });
std::cout << x.size() << std::endl;
std::set<int, C> y(x.begin(), x.end());
std::cout << y.size() << std::endl;
std::set<int>::iterator iter;
for (iter = y.begin(); iter != y.end(); ++iter)
{
std::cout << *iter << std::endl;
}
return 0;
}
答案 0 :(得分:3)
set的第二个模板参数是比较器类型 - 实现较少操作的仿函数类型。
struct C
{
bool operator()(const int &a, const int &b) const
{
return a % 10 < b % 10;
}
};
此比较器仅在a
时将b
和a < b
作为a % 10 < b % 10
进行比较,因此几乎所有数字都将以模10进行比较。
更新:
在推入x
设置数字{ 4, 2, 7, 11, 12, 14, 17, 2 }
后,设置将包含七个元素{ 2, 4, 7, 11, 12, 14, 17 }
。这些元素将以这种方式排序,因为set
以排序的方式存储对象。
然后x
集中的数字被顺序插入y
集。在插入每个元素之前,set
将按当前插入的数字的排序顺序找到适当的位置。如果set
会看到,那里已经有一些数字,set
将不会插入它。
从{2, 4, 7}
插入x
到y
后,y
将为{2, 4, 7}
。
然后,将11
插入y
set
将11
与{2, 4, 7}
进行比较,以便使用提供的C
仿函数找到合适的位置。
要检查11
是否小于2
set
会调用C()(11, 2)
,这将导致11 % 10 < 2 % 10
比较,这将导致true
,所以我会在11
之前插入2
。
x
(12, 14, 17
)中的其他数字不会被插入,因为set
会找到,12
应该代替2
(因为2 % 10 < 12 % 10 or 12 % 10 < 2 % 10
表达式为false,因此2 == 12
),同样14
和17
。