set是集合,其底层数据结构是红黑树,STL中set、map均采用红黑树结构作为底层支持,红黑树与AVL树类似,是一种平衡查找树。
set的特性是集合的基本特性:元素唯一性等。
通过algorithm中提供的set_intersection、set_union、set_difference、set_symmetric_difference四个函数,可以方便的实现集合的交、并、差、对称差操作,很强大
template
<
class
_InputIter1,
class
_InputIter2,
class
_OutputIter,
class _Compare >
_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result, _Compare __comp) {
__STL_REQUIRES(_InputIter1, _InputIterator);
__STL_REQUIRES(_InputIter2, _InputIterator);
__STL_REQUIRES(_OutputIter, _OutputIterator);
__STL_REQUIRES_SAME_TYPE(
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
__STL_BINARY_FUNCTION_CHECK(_Compare, bool ,
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
while (__first1 != __last1 && __first2 != __last2)
if (__comp( * __first1, * __first2))
++ __first1;
else if (__comp( * __first2, * __first1))
++ __first2;
else {
* __result = * __first1;
++ __first1;
++ __first2;
++ __result;
}
return __result;
}
class _Compare >
_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result, _Compare __comp) {
__STL_REQUIRES(_InputIter1, _InputIterator);
__STL_REQUIRES(_InputIter2, _InputIterator);
__STL_REQUIRES(_OutputIter, _OutputIterator);
__STL_REQUIRES_SAME_TYPE(
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
__STL_BINARY_FUNCTION_CHECK(_Compare, bool ,
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
while (__first1 != __last1 && __first2 != __last2)
if (__comp( * __first1, * __first2))
++ __first1;
else if (__comp( * __first2, * __first1))
++ __first2;
else {
* __result = * __first1;
++ __first1;
++ __first2;
++ __result;
}
return __result;
}
template
<
class
_InputIter1,
class
_InputIter2,
class
_OutputIter,
class _Compare >
_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result, _Compare __comp) {
__STL_REQUIRES(_InputIter1, _InputIterator);
__STL_REQUIRES(_InputIter2, _InputIterator);
__STL_REQUIRES(_OutputIter, _OutputIterator);
__STL_REQUIRES_SAME_TYPE(
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
__STL_BINARY_FUNCTION_CHECK(_Compare, bool ,
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
while (__first1 != __last1 && __first2 != __last2) {
if (__comp( * __first1, * __first2)) {
* __result = * __first1;
++ __first1;
}
else if (__comp( * __first2, * __first1)) {
* __result = * __first2;
++ __first2;
}
else {
* __result = * __first1;
++ __first1;
++ __first2;
}
++ __result;
}
return copy(__first2, __last2, copy(__first1, __last1, __result));
}
class _Compare >
_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result, _Compare __comp) {
__STL_REQUIRES(_InputIter1, _InputIterator);
__STL_REQUIRES(_InputIter2, _InputIterator);
__STL_REQUIRES(_OutputIter, _OutputIterator);
__STL_REQUIRES_SAME_TYPE(
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
__STL_BINARY_FUNCTION_CHECK(_Compare, bool ,
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
while (__first1 != __last1 && __first2 != __last2) {
if (__comp( * __first1, * __first2)) {
* __result = * __first1;
++ __first1;
}
else if (__comp( * __first2, * __first1)) {
* __result = * __first2;
++ __first2;
}
else {
* __result = * __first1;
++ __first1;
++ __first2;
}
++ __result;
}
return copy(__first2, __last2, copy(__first1, __last1, __result));
}
template
<
class
_InputIter1,
class
_InputIter2,
class
_OutputIter,
class _Compare >
_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result, _Compare __comp) {
__STL_REQUIRES(_InputIter1, _InputIterator);
__STL_REQUIRES(_InputIter2, _InputIterator);
__STL_REQUIRES(_OutputIter, _OutputIterator);
__STL_REQUIRES_SAME_TYPE(
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
__STL_BINARY_FUNCTION_CHECK(_Compare, bool ,
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
while (__first1 != __last1 && __first2 != __last2)
if (__comp( * __first1, * __first2)) {
* __result = * __first1;
++ __first1;
++ __result;
}
else if (__comp( * __first2, * __first1))
++ __first2;
else {
++ __first1;
++ __first2;
}
return copy(__first1, __last1, __result);
}
class _Compare >
_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result, _Compare __comp) {
__STL_REQUIRES(_InputIter1, _InputIterator);
__STL_REQUIRES(_InputIter2, _InputIterator);
__STL_REQUIRES(_OutputIter, _OutputIterator);
__STL_REQUIRES_SAME_TYPE(
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
__STL_BINARY_FUNCTION_CHECK(_Compare, bool ,
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
while (__first1 != __last1 && __first2 != __last2)
if (__comp( * __first1, * __first2)) {
* __result = * __first1;
++ __first1;
++ __result;
}
else if (__comp( * __first2, * __first1))
++ __first2;
else {
++ __first1;
++ __first2;
}
return copy(__first1, __last1, __result);
}
template
<
class
_InputIter1,
class
_InputIter2,
class
_OutputIter,
class _Compare >
_OutputIter
set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result,
_Compare __comp) {
__STL_REQUIRES(_InputIter1, _InputIterator);
__STL_REQUIRES(_InputIter2, _InputIterator);
__STL_REQUIRES(_OutputIter, _OutputIterator);
__STL_REQUIRES_SAME_TYPE(
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
__STL_BINARY_FUNCTION_CHECK(_Compare, bool ,
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
while (__first1 != __last1 && __first2 != __last2)
if (__comp( * __first1, * __first2)) {
* __result = * __first1;
++ __first1;
++ __result;
}
else if (__comp( * __first2, * __first1)) {
* __result = * __first2;
++ __first2;
++ __result;
}
else {
++ __first1;
++ __first2;
}
return copy(__first2, __last2, copy(__first1, __last1, __result));
}
class _Compare >
_OutputIter
set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result,
_Compare __comp) {
__STL_REQUIRES(_InputIter1, _InputIterator);
__STL_REQUIRES(_InputIter2, _InputIterator);
__STL_REQUIRES(_OutputIter, _OutputIterator);
__STL_REQUIRES_SAME_TYPE(
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
__STL_BINARY_FUNCTION_CHECK(_Compare, bool ,
typename iterator_traits < _InputIter1 > ::value_type,
typename iterator_traits < _InputIter2 > ::value_type);
while (__first1 != __last1 && __first2 != __last2)
if (__comp( * __first1, * __first2)) {
* __result = * __first1;
++ __first1;
++ __result;
}
else if (__comp( * __first2, * __first1)) {
* __result = * __first2;
++ __first2;
++ __result;
}
else {
++ __first1;
++ __first2;
}
return copy(__first2, __last2, copy(__first1, __last1, __result));
}