一般来说,程序编写中使用到STL容器时,一般第一个模板参数是必选的,而后面的参数往往使用默认参数。当并不能说明后面的参数是没有用的。下面是一个优先级队列的使用实例,通过修改后面的模板参数,达到修改优先级队列行为的目的。
struct
MyTaskStruct
{
ACE_Time_Value tTaskStamp;
std
::
string
str
;
static
bool
CompareTimeValueLess
(
const
MyTaskStruct
&
a
,
const
MyTaskStruct
&
b
)
{
return
a
.
tTaskStamp
<
b
.
tTaskStamp
;
}
static
bool
CompareTimeValueGreater
(
const
MyTaskStruct
&
a
,
const
MyTaskStruct
&
b
)
{
return
a
.
tTaskStamp
>
b
.
tTaskStamp
;
}
};
template
<
class
_Ty
>
struct
TimeValueLess
:
std
::
binary_function
<
_Ty
,
_Ty
,
bool
> {
bool
operator
()(
const
_Ty
&
_X
,
const
_Ty
&
_Y
)
const
{
return
_Ty
::
CompareTimeValueLess
(
_X
,
_Y
); }
};
template
<
class
_Ty
>
struct
TimeValueGreater
:
std
::
binary_function
<
_Ty
,
_Ty
,
bool
> {
bool
operator
()(
const
_Ty
&
_X
,
const
_Ty
&
_Y
)
const
{
return
_Ty
::
CompareTimeValueGreater
(
_X
,
_Y
); }
};
std
::
priority_queue
<
MyTaskStruct
,
std
::
vector
<
MyTaskStruct
>,
TimeValueGreater
<
MyTaskStruct
> >
MyQueue
;
MyTaskStruct
struct1
;
struct1.tTaskStamp = ACE_OS::gettimeofday();
struct1
.
str
=
"struct1"
;
ACE_OS::sleep(1);
MyTaskStruct
struct2
;
struct2.tTaskStamp = ACE_OS::gettimeofday();
struct2
.
str
=
"struct2"
;
ACE_OS::sleep(1);
MyTaskStruct
struct3
;
struct3.tTaskStamp = ACE_OS::gettimeofday();
struct3
.
str
=
"struct3"
;
printf("Hello World!/n");
MyQueue
.
push
(
struct2
);
MyQueue
.
push
(
struct1
);
MyQueue
.
push
(
struct3
);
while
(!
MyQueue
.
empty
())
{
MyTaskStruct
structT
=
MyQueue
.
top
();
MyQueue
.
pop
();
printf
(
"%s/n"
,
structT
.
str
.
c_str
());
}