当我只对比较部分值感兴趣并且不能假设其他部分的默认构造函数时,如何使用std :: lower_bound

时间:2014-11-18 12:27:59

标签: c++

这是我想做的。使用通用排序容器。对于关联容器,搜索密钥,查找通用值。对于非关联容器搜索键,找到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 );

2 个答案:

答案 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闭包而不是预定义的类。不过,我会让它站起来。