1
bool pred(int k, int l, int num1, int num2)  
{
return (num1 < num2);
}

int main()
{
   vector <int> nums;
   for (int i=50; i > 0; --i)
   {
      nums.push_back(i);
   }
   std::sort (nums.begin(), nums.end(), boost::bind(&pred, 5, 45));
}

私はブースト初心者です。私はboost::bindの使い方を学んでいて、整数のベクトルを並べ替えて、ベクトル内の45より大きく5より小さい要素をすべて取り除きたいと思っていました。それを行うのに苦労しました。誰かが私がそれをするのを手伝ってくれるなら素晴らしいでしょうか?

私が問題に直面している理由は、ベクトルを反復処理してソートしているときに、ベクトル要素を削除しようとしているためです。最初に並べ替えてから要素を削除すると、はるかに簡単になることを私は知っています。でもこうやってやりたいです。どんな助けでも大歓迎です。

4

3 に答える 3

4

からそれを行うことはできませんsort

の前後の要素を削除しますsort

bool outOfRange(int low, int high, int num) {
    return low > num || num > high;
}

...

    nums.erase(
            std::remove_if(nums.begin(), nums.end(),
                    boost::bind(&outOfRange, 5, 45, _1)),
            nums.end()
        );

あなたは本当に全く必要ではありませんがboost::bind。ちなみに、もう少し一般的なものにすることもできます。

template<typename T, class cmp = std::less<T> >
struct outOfRange : std::unary_function<T, bool> {
    outOfRange(const T &low, const T &high) : low(low), high(high) {}
    bool operator()(const T &val) { return cmp()(val, low) || cmp()(high, val); }
    const T &low, &high;
}

...

    nums.erase(
            std::erase_if(nums.begin(), nums.end(), outOfRange<int>(5, 45)),
            nums.end()
        );
于 2009-11-04T23:05:51.600 に答える
2

それを行うには多くの方法があります。最も簡単なのは、最初にすべての不要な要素を削除してから、並べ替えることです。

bool outsideRange(int num, int min, int max)  
{
  return (num < min) || (num > max);
}

nums.erase(std::remove_if(nums.begin(),nums.end(),boost::bind(&outsideRange,_1,5,45) ) ); // See comments about remove-erase idiom.
std::sort(nums.begin(),nums.end());

ブーストバインドを使用する場合は、プレースホルダー(_1)を含める必要があることに注意してください。これにより、どの引数が繰り返されるかがわかります。

1つのステップでそれを実行したい場合は、条件付きですべてのintをマルチセットにコピーして、アイテムを並べ替えることができます。

bool outideRange(int num, int min, int max)  
{
    return (num < min) || (num > max);
}

std::multiset numsInSet;
std::remove_copy_if(
   nums.begin(),
   nums.end(),
   std::inserter(numsInSet,numsInSet.begin()), 
   boost::bind(&outideRange,_1,5,45) );
于 2009-11-04T23:27:51.613 に答える
0

std :: sortはベクトルの順序にのみ影響し、値自体を変更することはできないため、あなたのアイデアは完全には不可能です。

私が考えることができる最も近いことは、すべての有効な値(> =5および<=45)が無効な値の前に来るが、有効な値と無効な値の両方がソートされることです。

bool pred(int min, int max, int num1, int num2)
{
    bool num1_valid = (num1 >= min) && (num1 <= max);
    bool num2_valid = (num2 >= min) && (num2 <= max);

    if (num1_valid == num2_valid)
    {
        return num1 < num2; 
    }
    else
    {
        return num1_valid;
    }
}
于 2009-11-04T23:21:40.783 に答える