c++ - 使用 boost::bind 排序

标签 c++ sorting stl vector boost-bind

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,我想对一个整数 vector 进行排序,并去除 vector 中大于 45 且小于 5 的所有元素。很难做到这一点。如果有人可以帮我做,那就太好了?

我遇到问题的原因是因为我试图在遍历 vector 以对其进行排序时摆脱 vector 元素。我知道如果我先对它进行排序然后从中删除元素会容易得多。但我想这样做。感谢您的帮助。

最佳答案

您不能通过 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()
        );

关于c++ - 使用 boost::bind 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1677211/

相关文章:

c++ - tmalloc_large 检测到 Cocos2d-x 堆损坏

c++ - 需要一个带有 O(1) 删除的 std::vector

javascript - 在 C++ 中对扩展 ASCII std::string 进行 URL 编码

java - boolean 解释

c++ - 使用基于动态/状态的分配器的 STL 实现?

c++ - 容器前后行为

c++ - 如何从 C++ 中的路径中提取文件名和扩展名

java - 按字母顺序对字符串数组中的各个元素进行排序

java - 这是按标题、位置排序然后使用比较器排序的正确方法吗?

c++ - 如何使用 STL 对字符串进行不区分大小写的二分搜索