タプルのリストを持っています。リストはタプルの最初の要素に基づいてソートされていますが、2番目と最後の要素はランダムな順序です。今度は、範囲内の最初の要素を持つすべてのタプルを検索します。つまり、(tuple.first>-X
とtuple.first<X
)のタプルをすべて返します。これらの返ってくるタプルの中で、私はタプルの2番目の要素で最大値と最小値を見つける必要があります。どのようにSTLアルゴリズムはこれを実装できますか?範囲内の最初の要素を持つすべてのタプルを見つけるSTLアルゴリズム
答えて
、あなたは「面白い」タプルの範囲を区切るイテレータのペアを取得するためにequal_range
を使用することができます。
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
そう...それは、単一のSTLアルゴリズムではありません。
注:std::min_element
とstd::max_element
が存在しますが、それは範囲にわたり二回ループする意味し、それはしかし確かに実現可能です。
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;
それはタプルを与えることを注意しなく.second
部材。
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;
私は最近のコンパイラを持っている場合、boost ::はstd ::と置き換えることができます(私はしません)。それがすでにソートされているので
ありがとうございます。コードはきちんとしています:)私は自分のコードでタプルを使用するのはあまりにも複雑かもしれないことがわかりました。ですから、代わりにペアを使用するように変更します。 [code] ベクトル
コンパイラのエラーは何ですか?このコードでは、boostを動作させる必要があります。あるいは、コンパイラにpost C++ 98がある場合は、代わりに
- 1. 配列内の最小要素を見つける再帰アルゴリズム
- 2. 与えられた範囲内のすべての素数を見つける
- 3. STLを使用して反対のcatgeories間で一致するプロパティを持つ要素を見つけるアルゴリズム
- 4. 範囲内の素数を見つけるpython
- 5. タプル要素の最大値を見つけるC++
- 6. 大きい範囲のすべてのサブ範囲を見つける
- 7. 範囲内のすべての一致するセルの値を見つける
- 8. データセット内の要素間の関係を見つけるアルゴリズム
- 9. XPathの頭痛、範囲内の属性を持つノードを見つける
- 10. vba - 複数の範囲値を持つセットを見つける
- 11. リスト内のタプル付き要素をPythonで見つけよう
- 12. C++ STL :: multimapから範囲内の要素の数を調べる
- 13. サブライムテキストプラグイン - 選択範囲内のすべての地域を見つける方法
- 14. 範囲変数から最初と最後の行番号を見つける
- 15. ST_Contains。範囲内にあるすべての道路を見つける
- 16. Java 8のリストから最初の要素を見つける
- 17. 最初の要素のインデックス>は、STL :: algorithmを持つベクトルの数値に?
- 18. 配列の範囲を見つける
- 19. 範囲のアドレスを見つける
- 20. 同等の範囲のSTLアルゴリズム
- 21. Python:タプルのリストで一致する要素を見つける
- 22. リスト内の要素を見つける
- 23. Jquery:DIV内の要素を見つける
- 24. 酵素が要素の最初のインスタンスを見つけて選択します
- 25. scala - 最初の要素の値でリスト内のペアを見つけよう
- 26. 最高と最低の要素数を持つ配列を見つける
- 27. 配列内の最小要素の位置を見つける
- 28. SQL - すべての最初の要素で共有される2番目の要素を持つすべてのタプルを取得します。
- 29. 数値の範囲内のギャップを見つける
- 30. 別の範囲内の地理的地点を見つける -
HI Matthieu M.最初のコードは私のコンパイラ(VS2011)を渡しません。ちなみに、私は(t.first-thirdparameter> -X)&&(t.first-thirdparameter)
user1285419
@ user1285419:範囲が絶対値でソートされていないため、等しい範囲はカットされていないようです。代わりに 'lower_bound'と' upper_bound 'を使う必要があります。 –
私は、O(2N)とは対照的に、O(max(floor(3/2(N-1))、0)を与えるminmax_elementを使用します: – Vitali