获取有条件的std :: vector中的范围,满足某些条件

时间:2014-10-23 11:28:34

标签: c++ std

我有一个排序std::vector。现在我需要获得满足某些条件的物品范围。例如。

vector -> 1, 4, 25, 73 450
get range that is smaller then 100 -> {1, 4, 25, 73}

如何使用std?

执行此操作

3 个答案:

答案 0 :(得分:3)

最简单的方法是使用标准算法std::lower_bound

例如

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

int main() 
{   
    std::vector<int> v = { 1, 4, 25, 73, 450 };

    auto last = std::lower_bound( v.begin(), v.end(), 100 );

    for ( auto it = v.begin(); it != last; ++it ) std::cout << *it << ' ';
    std::cout << std::endl;

    return 0;
}

输出

1 4 25 73 

如果要替换陈述

auto last = std::lower_bound( v.begin(), v.end(), 100 );

auto last = std::lower_bound( v.begin(), v.end(), 50 );

然后输出

1 4 25 

依此类推。:)

答案 1 :(得分:1)

我认为你可以使用std::equal_range。只需以正确的方式定义谓词即可。请注意,您提供的示例条件符合equal_range的条件,但对于其他条件,您可能无法使用std :: equal_range。

以下是给定示例的示例谓词:

bool smaller(int a, int b) {
  return (a < 100) > (b < 100);
}

这里我认为两个数字相等,如果他们以相同的方式比较100。如果他们不小于100的数字小于不小于100的数字。现在你可以打电话:

equal_range(a.begin(), a.end(), 50 /* any number < 100 */, smaller);

答案 2 :(得分:0)

听起来remove_ifremove_if_copy是您正在寻找的内容,例如:

std::vector<int> results;
std::remove_copy_if( original.cbegin(), original.cend(), std::back_inserter( results ),
                     []( int value ) { return value < 100; } );

将实际问题放在lambda中你需要的任何东西。 (在C ++之前的版本11中,您必须使用调用remove_copy_if的函数外部的谓词来定义函数对象,否则,原则是相同的。)