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的所有元素。这很难做到。如果有人能帮我这么做会很棒吗?
我面临问题的原因是因为我试图摆脱向量元素,同时迭代向量来对其进行排序。我知道如果我先排序然后从中删除元素会更容易。但我想这样做。任何帮助表示赞赏。
答案 0 :(得分: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()
);
答案 1 :(得分: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 bind时,你需要包含占位符(_1),它告诉它哪个参数是被迭代的参数。
如果您希望一步到位,您可以有条件地将所有内容复制到多个集合中,以便为您排序项目:
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) );
答案 2 :(得分:0)
你的想法不太可能,因为std :: sort只能影响矢量的排序,不能自己修改值。
我能想到的壁橱里的东西是近似你想要的是让所有有效值(那些是&gt; = 5和&lt; = 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;
}
}