第三项以您可以调用的方式描述了您正在搜索的内容
compare_function(*iter, value )
或者
compare_function( value, *iter )
whereiter是您的集合中的有效迭代器。如果必须出现在您的列表中以保持排序,这应该true在第一种情况下返回,在第二种情况下反之亦然。*itervalue
因此请注意,如果您支持这两个重载,您实际上可以将 astring作为第三个参数传入。compare_function原型是:
template <class ForwardIterator, class T, class Compare>
bool binary_search ( ForwardIterator first, ForwardIterator last,
const T& value, Compare comp );
并且 T 不一定是迭代器的值类型。
顺便说一句,虽然您可以将它用于 a std::list,但对于不是随机访问的迭代器来说效率极低,因为每个std::advance语句都是O(N)因此整个操作是O(N log N). 即使是普通人std::find也会更快。
使用vectorormultiset如果你可以有重复,或者set如果你不允许重复。
binary_search它本身也会返回该项目是否存在并且true/false没有找到你的项目(所以你不会知道他们的国家)。如果您有重复项,您可以使用它std::equal_range来获取所有此类值的列表。如果不这样做,您可以使用std::lower_boundwhich 将为您提供一个迭代器,指向名称等于或大于您的名称的第一个项目,然后检查它是否相等,而不是更大。