2017-04-02 12 views
-1

私はstd::vectorの値をdoubleとしました。ソート結果を特定の最小値と最大値に制限する方法を探しています。私は例を提供してみましょう -与えられた最小値と最大値のためにstd :: vectorを制限する

std::vector<double> v; 
v.push_back(2.5); 
v.push_back(3.5); 
v.push_back(4.5); 
v.push_back(5.5); 
v.push_back(6.5); 

を上記の例では、私はlimit(v, 4.0, 7.0);を実行する場合、それは私のインデックスが[4]または終了または任意に[2]を例えば提供する必要があります。 <algorithm>ヘッダーを検索しようとしましたが、見つからない場合があります。/必要が生じた場合は追加のライブラリも使用できます。

答えて

3

あなたはstd::lower_boundstd::upper_boundを探しています:

auto it1 = std::lower_bound(v.begin(), v.end(), 4.0); 
auto it2 = std::upper_bound(it1, v.end(), 7.0); 

for (auto it = it1; it != it2; ++it) 
    std::cout << *it << "\n"; 
+0

[デモ](https://ideone.com/Lj7amd) –

+0

おかげで、私もそれが名前だ知らなかった、5〜10分間探してみましたので、私は、質問を投稿。私は8分後に受け入れます。 –

1

Kerrek SBのソリューションは素晴らしいですが、vがソートされていることを意味します。ソートされていない場合は、std::partitionを使用します。

#include <algorithm> 
#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<double> v = { 4.5, 2.5, 5.5, 6.5, 3.5 }; 

    auto part = std::partition(v.begin(), v.end(), [](double d){return 4 < d && d < 7;}); 

    for (auto it = std::begin(v); it != part; ++it) 
    std::cout << *it << "\n"; 
} 

Demo

+0

ソートしてからこれを選択して上下限を適用すると、複雑さの違いは何ですか? –

+0

ああ、元のコンテナに変更を加えるので、まったく同じではありません。良い答えが、私のケースでは、私のコンテナはすでにソートされているので、元のコンテナに変更したくないので動作しません。 –

+0

@LaserFocusソートは通常O(N log N)で、 'lower_bound'と' upper_bound'は要素までの距離で対数です。パーティショニングはO(N log N)ですが、わかりません。説明は少し混乱しています。 –