问题 在set >中查找具有特定第一个坐标的任何元素


我想弄清楚以下问题。

假设我在C ++中有以下容器:

std::set<std::pair<int, int> > my_container;

该组(字典)按照顺序排序 < 上 std::pair<int, int>,这是词典顺序。我的任务是找到 任何 元素 my_container 第一个坐标等于,比方说 x,并将迭代器返回给它。显然,我不想用 find_if,因为我需要在对数时间内解决这个问题。

我很感激有关如何做到这一点的任何建议


6038
2018-01-03 14:50


起源



答案:


您可以使用 lower_bound 为了这:

auto it = my_container.lower_bound(std::make_pair(x, std::numeric_limits<int>::min());

这将为您提供第一个元素的迭代器 e 为此 e < std::pair(x, -LIMIT) 不成立。

这样的元素要么具有第一个成分> x (在这种情况下没有 x 在集合中),或者第一个成分等于 x 并且是第一个这样的。 (请注意,所有第二个组件都大于或等于 std::numeric_limits<int>::min() 根据定义)。


8
2018-01-03 14:59





你可以用 的std ::设置:: LOWER_BOUND 得到范围的下限和上限,如下所示:

#include <set>
#include <iostream>

// for readability
typedef std::set<std::pair<int, int> > int_set;

void print_results(const int_set& s, int i)
{
    // first element not less than {i, 0}
    int_set::const_iterator lower = s.lower_bound(std::make_pair(i, 0));

    // first element not less than {i + 1, 0}
    int_set::const_iterator upper = s.lower_bound(std::make_pair(i + 1, 0));

    for(int_set::const_iterator iter = lower; iter != upper; ++iter)
        std::cout << iter->first << ", " << iter->second << '\n';
}

int main()
{
    int_set s;

    s.insert(std::make_pair(2, 0));
    s.insert(std::make_pair(1, 9));
    s.insert(std::make_pair(2, 1));
    s.insert(std::make_pair(3, 0));
    s.insert(std::make_pair(7, 6));
    s.insert(std::make_pair(5, 5));
    s.insert(std::make_pair(2, 2));
    s.insert(std::make_pair(4, 3));

    print_results(s, 2);
}

输出:

2, 0
2, 1
2, 2

1
2018-01-03 15:16