在对第二个值进行排序后,您可以执行二进制搜索。 (如果没有排序,你可以直接使用std::find_if,它是线性的)
要执行二进制搜索,您需要使用std::lower_bound,这很棘手。您需要提供一个仿函数来告诉它您的向量是如何排序的,在这种情况下是通过第二个值。如果找到该值,则返回一个迭代器给它。如果它没有找到该值,它要么返回一个指向另一个值的迭代器,要么返回一个结束迭代器。 if 语句检查结束迭代器 first,因为取消引用结束迭代器是无效的。
如果您的向量没有按第二个值排序,这将不起作用。您可能想要断言它是首先排序的,以避免发生意外。
提供给std::lower_bound的函子只需要第二个参数的键类型(搜索时,第一对值不构成键)。但是要断言它已排序,两个参数都必须是存储在向量中的类型。
std::vector<std::pair<T1, T2>> data;
T2 find_val;
// check the vector is sorted properly
assert(std::is_sorted(data.begin(), data.end(), [](const std::pair<T1, T2>& left, const std::pair<T1, T2>& right){ return left.second < right.second; }));
// attempt to find our value
auto find_it = std::lower_bound(data.begin(), data.end(), find_val, [](const std::pair<T1, T2>& left, const T2& right){ return left.second < right; });
// check it's not the end iterator and it actually points to our value
if (find_it != data.end() && find_it->second == find_val)
{
// found it!
auto& retrieve_val = find_it->first;
}
else
{
// not found
}
这是一个使用std::find_if 的示例,它是线性搜索,但不关心向量是否已排序。
auto find_it = std::find_if(data.begin(), data.end(), [&find_val](const std::pair<T1, T2>& val){ return val.second == find_val; });
if (find_it != data.end())
{
// found it!
auto& retrieve_val = find_it->first;
}
else
{
// not found
}