2017-04-02 111 views
-1

我有std::vectordouble值,我正在尋找一種方法將排序結果限制爲某些最小值和最大值。讓我提供一個例子 -對於給定的最小值和最大值,限制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);應該給我提供的索引,例如[2][4]或結束或什麼的。我試圖搜索<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日誌N),但我不確定。說明有點令人困惑。 –

相關問題