【问题标题】:sort using boost::bind使用 boost::bind 排序
【发布时间】:2009-11-04 22:46:48
【问题描述】:
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 的所有元素。很难做到。如果有人可以帮我做这件事会很棒吗?

我遇到问题的原因是因为我试图在迭代向量以对其进行排序时摆脱向量元素。我知道如果我先对其进行排序然后从中删除元素会容易得多。但我想这样做。任何帮助表示赞赏。

【问题讨论】:

    标签: c++ sorting stl vector boost-bind


    【解决方案1】:

    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()
            );
    

    【讨论】:

    • 我认为你需要在 boost::bind 表达式中包含一个占位符: boost::bind(&outOfRange, 5, 45, _1)
    • 是的,我愿意,哎呀。我会解决这个问题,实际上可能会同时简化一些事情。
    • boost::lambda 在这种情况下比boost::bind 有用得多:std::erase_if(nums.begin(), nums.end(), _1 &lt; 5 || _1 &gt; 45); 不过,如果你出错了,错误消息会很可怕!
    【解决方案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());
    

    请注意,使用 boost 绑定时,您需要包含占位符 (_1),它告诉它哪个参数是被迭代的参数。

    如果您更喜欢一步完成,您可以有条件地将所有 int 复制到一个 multiset 中,它会为您对项目进行排序:

    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) );
    

    【讨论】:

    【解决方案3】:

    你的想法不太可能,因为 std::sort 只能影响你的向量的顺序,不能自己修改值。

    我能想到的最接近你想要的是让所有有效值(>= 5 和

    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 2016-03-16
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 2014-06-11
      • 2023-04-07
      • 2012-04-18
      • 2011-07-11
      相关资源
      最近更新 更多