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.firstListType::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;