我有std::vector
个double
个值,我正在寻找一种方法来将排序结果限制为某些最小值和最大值。让我举个例子 -
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>
标题,但找不到一个:/如果需要,我也可以使用其他库。
答案 0 :(得分:3)
您正在寻找std::lower_bound
和std::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";
答案 1 :(得分: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";
}