【发布时间】:2017-07-20 16:06:08
【问题描述】:
我有一个已排序的向量,现在我想从该向量中找到具有特定 id 的元素。 std::binary_search 只是告诉我元素是否存在,所以我使用std::lower_bound:
#include <vector>
#include <iostream>
#include <algorithm>
struct Foo {
int id;
// ... more members ... //
Foo(int id) : id(id) {}
};
bool compareById(const Foo& a,const Foo& b) { return a.id < b.id; }
int main(){
std::vector<Foo> vect;
vect.push_back(10);
vect.push_back(123);
vect.push_back(0);
std::sort(vect.begin(),vect.end(),compareById);
int id_to_find = 1;
std::vector<Foo>::iterator f = std::lower_bound(vect.begin(),vect.end(),Foo(id_to_find),compareById);
if (f != vect.end() && f->id == id_to_find) { std::cout << "FOUND"; }
}
这有点工作,但我非常不喜欢我必须创建一个 Foo(id_to_find) 以将其传递给 std::lower_bound 然后我必须仔细检查我得到的元素是否真的是我正在寻找的元素。
我想我可以使用find_if 来避免创建那个多余的实例,但据我所知find_if 只是线性的并且不使用正在排序的向量。我有点惊讶我找不到适合该任务的算法,我已经在考虑编写自己的算法了。
这样做的惯用方式是什么?
【问题讨论】:
-
你应该可以只传递
id_to_find或1而不是Foo(id_to_find)。 -
你用对了。如果你想让它更容易写一个包装器。你总是需要检查返回值,除非你在元素不存在时抛出异常。
-
@0x499602D2 afaik 这不会有所作为,因为无论如何,即使我没有明确写出
Foo,也会创建它。 (std::lower_bound需要const T&) -
@NathanOliver 好吧,我只是不确定,我有点担心创建一个不必要的实例,因为在实际代码中
Foo可能创建起来很昂贵(我可以只为此添加一个特殊的构造函数目的...很好地解决了问题:)
标签: c++ vector binary-search c++03