【问题标题】:A vector of pairs: first pair values are non-sorted and second pair values are sorted: how to find a sorted value when having the non-sorted one对的向量:第一对值是未排序的,第二对值是排序的:当有未排序的值时如何找到排序值
【发布时间】:2015-04-07 18:44:35
【问题描述】:

我有一个成对向量,如下所示。第一对值是未排序的,第二对值是排序的(从零开始)。我可能想通过实现std::vectorstd::pair 来存储数据。当我有第一对值(未排序)时,找到相应的第二对值(排序)的最佳方法是什么?实现它的最佳方法是什么?

反之亦然:当我有第二对值(排序,从零开始)时,我可以轻松找到对应的第一对值(未排序)。

【问题讨论】:

    标签: c++ sorting find stdvector std-pair


    【解决方案1】:

    在对第二个值进行排序后,您可以执行二进制搜索。 (如果没有排序,你可以直接使用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
    }
    

    【讨论】:

    • 这种情况下可以实现std::map吗? std::map 是个好主意吗?
    • @user3405291 是的,您可以使用std::map 来实现它。这是否是一个好主意取决于你在做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多