在《C++ Primer》关联容器的相关章节并没有介绍到multiset的多个构造函数的使用,在后来的章节中,涉及到一个问题的解决:如果multiset的元素类型是类类型,在不能使用默认的“<”操作符进行元素比较的时候,需要用到自定义的元素比较函数,将这个函数在multiset本身提供的构造函数中使用可以避免一些问题,具体详见《C++ Primer》第754页。但作为一个例子记下,作为一个使用模式的提醒:
首先,定义一个函数用于比较 Sales_item 对象:
// compare defines item ordering for the multiset in Basket inline bool compare(const Sales_item &lhs, const Sales_item &rhs) { return lhs->book() < rhs->book(); }
用下面代码将Comp 定义为函数类型指针的同义词,该函数类型与我们希望用来比较 Sales_item 对象的比较函数相匹配。
// type of the comparison function used to order the multiset typedef bool (*Comp)(const Sales_item&, const Sales_item&);
于是,就有了如下的定义multiset对象的形式:
std::multiset<Sales_item, Comp> items(compare);
“这个定义是说,items 是一个 multiset,它保存 Sales_item 对象并使用 Comp 类型的对象比较它们。multiset 是空的——我们没有提供任何元素,但我们的确提供了一个名为 compare 的比较函数。当在 items 中增加或查找元素时,将用 compare 函数对 multiset 进行排序。”
这个例题还有其它一点需要思考:MSDN中multiset的构造函数并没有看到这种形式。