比较运算符

时间:2010-10-21 12:55:57

标签: c++ vector comparison-operators

这可能是一个愚蠢的问题。 有没有办法在运行时使用字符串变量给比较运算符。
假设我有一个向量的薪水数据。


vector < int > salary;
Input:
salary[i] != /* ==,>,<,>=,<= (any comparison operator)) */ 9000.

如上所述给出的输入。我将比较运算符存储在字符串str中。 str =(任何比较运算符)。如果没有if并切换,有没有办法检查这样。


salary str 9000

8 个答案:

答案 0 :(得分:15)

您可以使用operator-strings作为键和函数对象创建一个映射,以便将相应的比较操作作为值。


创建地图:

std::map<std::string, boost::function<bool(int, int)> > ops;
ops["=="] = std::equal_to<int>();
ops["!="] = std::not_equal_to<int>();
ops[">"]  = std::greater<int>();
ops["<"]  = std::less<int>();
ops[">="] = std::greater_equal<int>();
ops["<="] = std::less_equal<int>(); 

使用它:

bool resultOfComparison = ops[str](salary[i], 9000);

(有关完整的工作示例,请参阅this link。)


修改

正如@sbi在下面的评论中所说,如果密钥不存在,使用map[key]访问地图将创建一个条目。所以请改用it = map.find(key)。如果结果等于map.end(),则找不到密钥,否则值为it->second。请注意这一点,同时根据您的需求调整此解决方案。

答案 1 :(得分:1)

但是,你可能有一个std::map,其中包含字符串内容和指向运算符的指针之间的映射。

答案 2 :(得分:0)

没有。不可能。除非你解析给定的输入并调用相应的操作。无论如何,你需要一个if - else语句。

答案 3 :(得分:0)

您需要在编程语言中使用某种EVAL来评估字符串。

编辑:C ++没有EVAL来支持你的事业。

答案 4 :(得分:0)

不,像C ++这样的编译语言不能像那样工作。在最终的可执行文件中必须有代码进行比较,并且按照设计,C ++不会生成该代码,除非它实际上在源程序中。

答案 5 :(得分:0)

您还可以创建一个仿函数,它将字符串作为构造函数或工厂,它将生成不同的仿函数(取决于您需要的灵活性)。

类似于:

:输入 Comp cmp = Comp(str);

if(cpm(salary [i],9000)) {    cout&lt;&lt; “哇”; }

答案 6 :(得分:0)

你必须在这个必需的评估中“破解”! ;)即

template <typename T>
bool eval_op(const string& op, const T& lhs, const T& rhs)
{
  switch(op.size())
  {
    case 2:
    {
      switch(op[1])
      {
        case '=':
        {
          switch(op[0])
          {
            case '=': return lhs == rhs;
            case '!': return lhs != rhs;
            case '>': return lhs >= rhs;
            case '<': return lhs <= rhs;
          }
        }
        default: throw("crazy fool!");
      };
    }
    case 1:
    {
      switch(op[0])
      {
        case '>': return lhs > rhs;
        case '<': return lhs < rhs;
        default: throw ("crazy fool!");
      }
    }
    default: throw ("crazy fool!");
  }

  return false;
}

免责声明:我没有对此进行测试......但这是一个想法...

答案 7 :(得分:0)

在这种特殊情况下,if-else分支是您最简单的解决方案。这只是因为只有这么多的比较选择,你可以肯定其他任何一个都不会存在。实质上,您的代码应该与

一致
if( in == "==" )
    cond = salary[i] == 9000;
else if( in == "!=" )
    cond = salary[i] != 9000;
// ...
else
  // throw, return -1, raise a flag or burst out in laughter

这实际上比动态eval()更安全,因为在这里您可以清理输入。你确保那里没有恶意代码,就像Little Bobby Tables攻击一样。

当然,你可以在这里使用多态,但多态性的观点是支持开放式的替代品。当您希望添加案例时,多态性允许您轻松地执行此操作。但是你需要做一些工作来建立基础,这里有6个比较选择。或者7,如果你想添加对任意谓词的支持。