1
    int nums[] = {7, 6, 12, 9, 29, 1, 67, 3, 3, 8, 9, 77};
    std::vector<int> vecInts(&nums[0], &nums[0] + sizeof(nums)/sizeof(nums[0]));

    int countBoost = 0;

    // (i > 5 && i <=10)
    countBoost = std::count_if(vecInts.begin(), vecInts.end(),
                      boost::bind(std::logical_and<bool>(), 
                                  boost::bind(std::greater<int>(),    _1, 5),
                                         boost::bind(std::less_equal<int>(), _1, 10))
                          );

ここで、純粋な STL を使用して同じ論理を実装する必要があります。どうやってやるの?

次のコードを試しましたが、うまくいきません。

int countSTL   = std::count_if(vecInts.begin(), vecInts.end(),
                           std::logical_and<bool>(std::bind2nd(std::greater<int>(), 5), std::bind2nd(std::less_equal<int>(), 10))                               
                          );

ありがとうございました

// 更新しました //

In Effective STL Item 43, Meyers indicates as follows:

vector<int>::iterator i = find_if(v.begin(), v.end(),
           compose2(logical_and<bool>(), bind2nd(greater<int>(), x),
                                         bind2nd(less<int>(), y)));

ただし、compose2 は標準の関数オブジェクト アダプターではありません。

4

1 に答える 1

0

「純粋な」C++03 stdを使用すると、これは追加のブール配列を使用する場合にのみ実行できます。2番目の配列bind2nd(greater<int>(), x)の場合と同じように、すべての結果を1つのブール配列にless格納します。logical_and3番目の配列への結果。動的サイズの場合-単純なraw配列の代わりにstd::vectorを使用します。または、 http:compose2<> //www.sgi.com/tech/stl/stl_function.hからSGI STLの実装をコピー(盗む)するだけです。

int main() {
    int nums[] = {7, 6, 12, 9, 29, 1, 67, 3, 3, 8, 9, 77};
    const size_t NUMS_SIZE = sizeof(nums) / sizeof(*nums);
    bool nums_greater[NUMS_SIZE];
    bool nums_less[NUMS_SIZE];
    bool nums_greater_and_less[NUMS_SIZE];

    int x = 3;
    int y = 20;
    transform(nums, nums + NUMS_SIZE, nums_greater, bind2nd(greater<int>(), x));
    transform(nums, nums + NUMS_SIZE, nums_less, bind2nd(less<int>(), y));
    transform (nums_greater, nums_greater+NUMS_SIZE, nums_less, nums_greater_and_less,
               logical_and<bool>() );

    int countBoost = 0;

    countBoost = count(nums_greater_and_less, nums_greater_and_less + NUMS_SIZE, true);

    cout << countBoost  << endl;
}
于 2012-09-26T15:54:11.100 に答える