c++ - 当我只对比较部分值感兴趣而不能为另一部分假定默认构造函数时,如何使用 std::lower_bound

标签 c++

这是我想做的。使用通用的排序容器。对于关联容器搜索键,找到通用值。对于非关联容器搜索键,找到 nullptr_t nullptr。这对于设置关联容器和非关联容器之间的交集很有用。

我有一个搜索函数,它应该将 &it 留在 std::pair 的下界,其中 i <= it->first。

template <typename Iter, typename End>
bool search (unsigned i, Iter& it, End& end) {...}

这就是我被难住的地方。 std::lower_bound 的第三个参数需要一个类型的引用。我只对寻找 it->first 的值(value)感兴趣。以前,我使用 value.second 的默认构造函数创建了一个虚拟值,但这看起来很糟糕。

std::lower_bound

template< class ForwardIt, class T, class Compare >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value, Compare comp );

最佳答案

您可以将异构比较器(即接受类型不同的参数的比较器) 传递给 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());

关于c++ - 当我只对比较部分值感兴趣而不能为另一部分假定默认构造函数时,如何使用 std::lower_bound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26994377/

相关文章:

c++ - gcc 和 clang 在表达式是否为常量的问题上存在分歧

c++ - printf 末尾的不需要的字符

c++ - Linux 堆栈跟踪转储

c++ - 为什么代码行即使从未运行也会出错?

c++ - 运行时字符串错误 C++

c++ - 检查 cv::Point 是否在 cv::Mat 内

c++ - 有趣的 C++ 代码片段,有什么解释吗?

c++ - 如何在C++中为输出传递参数

c++ - Qt 处理进程终止

c++ - 在同一个头文件中定义底层的顶层类初始化