使用自定义比较函数设置构造函数
set constructor with custom compare function
下面的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;
}
set 的第二个模板参数是比较器类型——实现 less 操作的函子类型。
struct C
{
bool operator()(const int &a, const int &b) const
{
return a % 10 < b % 10;
}
};
此比较器仅在 a % 10 < b % 10
时才会将 a
和 b
与 a < b
进行比较,因此实际上所有数字都将通过模 10 进行比较。
更新:
推入 x
集合数字 { 4, 2, 7, 11, 12, 14, 17, 2 }
后,集合将包含七个元素 { 2, 4, 7, 11, 12, 14, 17 }
。这些元素将以这种方式排序,因为 set
以排序方式存储对象。
然后 x
组中的数字将依次插入到 y
组中。在插入每个元素之前,set
将按照当前插入的数字的排序顺序找到合适的位置。如果 set
会看到,它的位置上已经有一些数字,set
将不会插入它。
从x
到y
插入{2, 4, 7}
后,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
表达式为假,所以2 == 12
),同理14
和17
.
下面的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;
}
set 的第二个模板参数是比较器类型——实现 less 操作的函子类型。
struct C
{
bool operator()(const int &a, const int &b) const
{
return a % 10 < b % 10;
}
};
此比较器仅在 a % 10 < b % 10
时才会将 a
和 b
与 a < b
进行比较,因此实际上所有数字都将通过模 10 进行比较。
更新:
推入 x
集合数字 { 4, 2, 7, 11, 12, 14, 17, 2 }
后,集合将包含七个元素 { 2, 4, 7, 11, 12, 14, 17 }
。这些元素将以这种方式排序,因为 set
以排序方式存储对象。
然后 x
组中的数字将依次插入到 y
组中。在插入每个元素之前,set
将按照当前插入的数字的排序顺序找到合适的位置。如果 set
会看到,它的位置上已经有一些数字,set
将不会插入它。
从x
到y
插入{2, 4, 7}
后,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
表达式为假,所以2 == 12
),同理14
和17
.