使用if_then_else控制结构进行c ++转换

时间:2010-02-12 03:57:21

标签: c++ boost lambda

我正在尝试使用变换和Boost Lambda中的if_then_else控制结构来更改向量中的整数值。但是我的编译器并不赞赏我的努力。我正在尝试的代码是:

transform(theVec.begin(), theVec.end(), theVec.begin(), 
          if_then_else(bind(rand) % ratio == 0, _1 = bind(rand) % maxSize, _1));

我尝试将其简化为以下内容:

transform(theVec.begin(), theVec.end(), theVec.begin(),
          if_then_else(0 == 0, _1 = MaxIntSizeCFG, _1));

但是编译器告诉我:没有匹配函数来调用'if_then_else(..........' 我读到控制结构的返回值是无效的,那么我在这种情况下的尝试用法是完全错误的吗?

提前感谢您的时间!

2 个答案:

答案 0 :(得分:1)

您使用中的

if_then_else不正确,与此相同:

int i = if (some_condition){ 0; } else { 1; };

你想要的只是三元运算符;但是,这不适用于lambda。您可以使用if_then_else_return结构来模拟它。 (即你很亲密!)

if_then_else用于for_each循环,您可以根据条件采取一个动作或另一个动作。 if_then_else_return用于三元条件。

答案 1 :(得分:1)

由于你已经使用了Boost,我推荐BOOST_FOREACH而不是这么复杂的lambda表达式:

BOOST_FOREACH(int & i, v)
    i = rand() % ratio ? i : rand();

一旦新的基于范围的for循环可用,这将非常容易适应:

for(int & i : v)
    i = rand() % ratio ? i : rand();