这是我想做的。使用通用排序容器。对于关联容器,搜索密钥,查找通用值。对于非关联容器搜索键,找到nullptr_t nullptr。它对于关联容器和非关联容器之间的集合交叉非常有用。
我有一个搜索功能,应该将它放在std :: pair的下限,其中i< = it->首先。
template <typename Iter, typename End>
bool search (unsigned i, Iter& it, End& end) {...}
这里是我难倒的地方。 std :: lower_bound的第3个参数引用了一个类型。我只对搜索它的价值感兴趣 - >首先。以前我使用value.second的默认构造函数创建了一个虚拟值,但这似乎是janked。
的std :: LOWER_BOUND
template< class ForwardIt, class T, class Compare >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value, Compare comp );
答案 0 :(得分:2)
您可以将异构比较器(即一个将类型不同的参数)传递给lower_bound
。第一个参数来自范围中的解引用迭代器,第二个参数将来自作为第三个参数传递给lower_bound
的值。所以,你可以使用这样的东西:
struct Compare
{
template<typename T1, typename T2>
bool operator()(T1 const& lhs, T2 const& rhs) const
{
return lhs.first < rhs;
}
};
然后你可以这样打电话给lower_bound
:
lower_bound(container.begin(), container.end(), value, Compare());
答案 1 :(得分:1)
您可以按如下方式使用std :: lower_bound(在C ++ 14中):
using T=int;
std::vector<std::pair<unsigned, T> > pairVector;
T searchedValue=1;
std::lower_bound(pairVector.begin(), pairVector.end(), searchedValue
, [](auto a, auto b) {return a.first < b;} )
请参阅here为什么这样的二元函数有效。
编辑:这与Benjamin Lindley的前一个答案基本相同,只是它使用lambda闭包而不是预定义的类。不过,我会让它站起来。