C++ 查找第一个元素在某一范围内的所有元组的STL算法

C++ 查找第一个元素在某一范围内的所有元组的STL算法,c++,stl,C++,Stl,我有一个元组列表,列表是根据元组的第一个元素排序的,但是第二个和最后一个元素是随机顺序的。现在我想找到一个范围内第一个元素的所有元组,即返回(tuple.first>-X和tuple.firstListType::iterator itrFirst=std::find_if(ls.begin(),ls.end(),boost::bind(&TupleType::get,_1)>=rangeStart); ListType::iterator itralst=std::find_if(itrFir

我有一个元组列表,列表是根据元组的第一个元素排序的,但是第二个和最后一个元素是随机顺序的。现在我想找到一个范围内第一个元素的所有元组,即返回(
tuple.first>-X
tuple.first
ListType::iterator itrFirst=std::find_if(ls.begin(),ls.end(),boost::bind(&TupleType::get<0>,_1)>=rangeStart);
ListType::iterator itralst=std::find_if(itrFirst,ls.end(),boost::bind(&TupleType::get<0>,_1)>rangeEnd);
对于(;itrFirst!=itrLast;++itrFirst)//打印范围内元素的键

std::cout get()因为它已经被排序,所以可以使用
equal_range
来获得一对迭代器,用于限定“有趣”元组的范围:


请注意,它提供了一个元组,而不是
.second
成员。

非常感谢。代码看起来很简洁:)我发现在代码中使用元组可能太复杂了。所以我修改它,改为使用pair。[代码]向量ls;vector::迭代器itrFirst=std::find_if(ls.begin(),ls.end(),boost::bind(&pair::first,_1)>=-0.01);vector::iterator itrLast=std::find_if(itrFirst,ls.end(),boost::bind(&pair::first,_1)>0.01);[/code]但它不起作用。你的编译器错误是什么?这段代码需要boost才能工作,或者如果你有一个c++98之后的编译器,你可以改为包含并使用std::bind.HI Matthieu M。第一段代码没有通过我的编译器(VS2011)。顺便问一下,如何传递第三个参数,以便将比较函数修改为(t.first-thirdparameter>-X)&(t.first-thirdparameter)@user1285419:您是对的,equal range似乎不会剪切它,因为这里的范围不是按绝对值排序的。您必须使用
下限
和`upper\u-bound来代替。我将使用minmax\u元素,它为您提供O(max(floor)(3/2(N−1) )而不是O(2N)@Vitali:真的!让我修正我的答案。
ListType::iterator itrFirst = std::find_if( ls.begin(), ls.end(), boost::bind( &TupleType::get< 0 >, _1 ) >= rangeStart );
ListType::iterator itrLast = std::find_if( itrFirst, ls.end(), boost::bind( &TupleType::get< 0 >, _1 ) > rangeEnd );
for( ;itrFirst != itrLast; ++itrFirst ) // Print keys for elements in range
    std::cout << itrFirst->get<0>() << std::endl;
It const begin = std::lower_bound(list.begin(), list.end(),
                                  [X](Tuple const& t) {
                                      return t.first > -X;
                                  });

It const end = std::upper_bound(begin, list.end(),
                                [X](Tuple const& t) {
                                    return t.first < X;
                                });

std::pair<It,It> const range = std::make_range(begin, end);
int min = INT_MAX, max = INT_MIN;

for (Tuple const& t: range) {
  if (t.second < min) { min = t.second; }
  if (t.second > max) { max = t.second; }
}

// min and max are correctly set
Tuple const& min = *std::min_element(range.first, range.second,
                       [](Tuple const& left, Tuple const& right) {
                           return left.second < right.second;
                       });

Tuple const& max = *std::max_element(range.first, range.second,
                       [](Tuple const& left, Tuple const& right) {
                           return left.second < right.second;
                       });

// Or as noted by Vitali, slightly more efficient:

auto const minmax = std::minmax_element(range.first, range.second, 
                       [](Tuple const& left, Tuple const& right) {
                           return left.second < right.second;
                       });

Tuple const& min = *minmax.first;
Tuple const& max = *minmax.second;