c++ - 我可以使用 STL 进行二分查找吗?

标签 c++ stl

我正在尝试重构一些不使用STL的代码以使用它提供的通用算法。 我有一个这样的结构:

struct A {
int i;
//other stuff...
};
// ...
A* array; // array of A objects, sorted by A::i member
int n = ...; // array size

然后有一个函数被编码为 A , n和一个整数 k ,其目的是为我提供指向数组中第一个和最后一个元素的指针,这些元素的 i成员等于 k .

这是通过二分查找手动实现的。我正在考虑使用 std::equal_range 。问题是它需要 A 类型的对象才能工作,并且它迫使我引入一个“虚拟”A 对象,其值为 i成员等于 k .

有没有办法使用 STL 来做到这一点,而不必引入“虚拟”对象? 谢谢

最佳答案

如果您的范围是根据 A::i 的值排序的,则可以使用 custom comparator 轻松完成此操作。 ,但请注意,比较器必须能够比较两种方式:

struct AComp
{
    bool operator()(int n, A const & a) const { return n < a.i; }
    bool operator()(A const & a, int n) const { return a.i < n; }
};

auto p = std::equal_range(array, array + n, 5, AComp());

现在范围[p.first, p.second)包含A::i等于5的元素。

链接页面或多或少包含此示例。

关于c++ - 我可以使用 STL 进行二分查找吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18749844/

相关文章:

c++ - std::set<T>::erase(key)。如果没有 key 怎么办?

c++ - 有什么用STL写的很酷的项目吗?

c++ - C++中具有相同名称但成员不同的结构

c++ - 为什么 operator""s 隐藏在命名空间中?

c++ - 为什么我的 WinCE 应用程序中没有 std::bad_alloc?

javascript - 如何将音频流从网页发送到 C++ 服务器?

c++ - 什么可能导致 ShellExecute 返回 SE_ERR_OOM(错误 8)?

c++ - 从文件中读取 N 个字节并将它们附加到 std::vector

c++ - 如果从不调用任何非常量方法,丢弃 const 是否安全

C++ STL map 存储和内存使用