布尔运算符,在C ++中有一个简单的方法吗?

时间:2012-09-07 05:52:26

标签: c++ syntax

我想做以下事情:

time_heap.insert(aid.arrival(event)!=NULL);

即,如果不是aid.arrival(event),则将返回值NULL插入time_heap。

这是一个在我的程序的主控件中会发生很多操作的操作,并希望在C ++中有一个简单的方法(除了定义我自己的函数来处理它)

186         void insert_event(Event* value) {
187             heap.push_back(value);               // expand size of heap
188             int i = heap.size() - 1;           // set heap index to that of "value" 
189             int parent = floor((i - 1)/2);
190 
191             while (parent >= 0 && parent < heap.size()) {                //check that parent is valid
192                 if (*heap[parent] > *value) {
193                     heap[i] = heap[parent];
194                     heap[parent] = value;                                // if "value" is smaller than parent move it up in heap (swap)
195                     i = parent;                                         // set new index of "value"
196                     parent = floor((i - 1)/2);                          // set new parent of "value"
197                 }
198                 else                                                  // if parent is not larger, value satisfies min-heap condition (since all below are lower, too)
199                     break;                                                  // (i.e. we are done)
200             }
201         }

4 个答案:

答案 0 :(得分:3)

if (Arrival *arrival = aid.arrival(event))
    time_heap.insert(arrival);

答案 1 :(得分:3)

表达式time_heap.insert(aid.arrival(event)!=NULL);不符合您的想法。 !=运算符是一个布尔运算符,返回0或1.因此表达式是一个整数,我怀疑你的代码将编译没有错误,因为insert需要一个指针。 你可以选择像

这样的东西
if ((Arrival *a = aid.arrival(event)) != NULL)
    time_heap.insert(a);

甚至

if (Arrival *a = aid.arrival(event))
    time_heap.insert(a);

就我个人而言,我更喜欢第一种选择,因为在下次修改代码时,某人(我)可能会错过===之间的差异。

答案 2 :(得分:0)

您应该能够删除与NULL的比较,因为NULL被认为是0值,因此是false。鉴于“x = aid.arrival(event)”,您可以使用if(x){time_heap.insert(x);}

答案 3 :(得分:-1)

我最喜欢的三元运算符可能是这样的吗? :

#include <iostream>
#include <set>

class A {
private:
  int m_i;
public:
  A() : m_i(0) { }
  A(int i) : m_i(i) { }
  int get() const { return m_i; }
  bool operator==(const int i) const { return (m_i==i); }
  bool operator<(const A& other) const { return (m_i<other.m_i); }
};

int main() {
  std::set<A> s;
  A a;
  ( (a = A(42))==42 ? s.insert(a).second : false );
  std::cout << s.begin()->get() << std::endl;
  return 0;
}

编辑:因为人们不喜欢三元运算符,所以你可以通过C ++ 11 lambdas(或Boost.Lambda)来实现某些东西:

#include <iostream>
#include <set>

class A {
private:
  int m_i;
public:
  A() : m_i(0) { }
  A(int i) : m_i(i) { }
  int get() const { return m_i; }
  bool operator==(const int i) const { return (m_i==i); }
  bool operator<(const A& other) const { return (m_i<other.m_i); }
};

int main() {
  std::set<A> s;
  A a;

  auto f = [&s] (A const& a) { if (a==42) s.insert(a); };

  f(A(42));
  f(A(43));

  std::cout << s.size() << " " << s.begin()->get() << std::endl;

  return 0;
}