2012-09-07 29 views
0

我要做到以下几点:布尔运算符,有没有简单的方法来做到这一点在C + +?

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

即插入的aid.arrival(event)返回值的time_heap如果不是NULL

这是一个在我的程序的主要控制中会发生很多操作,并希望有一个简单的方法来在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   } 
+1

你想在返回值为NULL时插入一些东西吗? 'insert'方法需要什么类型? – juanchopanza

+0

如果它是一个指针的容器,那么它可能期望一个指针。 – tadman

+2

你自己的方法有什么问题吗?如果您决定将存储从堆更改为其他内容或在稍后添加新的插入条件,它肯定会让您更轻松。不要重复自己。 –

回答

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

在[这并不总是这种情况](http://c-faq.com/null/machexamp.html)中,'NULL'可以推定为零。 – tadman

+0

短手* -.-是我发布的无效语法?我必须假设它是,但是我的代码中有太多事情正在编译和检查 – user1647959

+2

@tadman:'NULL'和'0'可转换为空指针,该空指针可能是也可能不是地址零(!)。 – Mehrdad

0

您应该能够删除与NULL为NULL被认为是一个0值,因此假的比较。鉴于“x = aid.arrival(事件)”你可以去if(x){time_heap.insert(x);}

+0

-1:你刚刚在堆上插入NULL。 –

+0

@AlexBrown - 编辑关于 – daveh

-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层的lambda(或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; 
} 
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); 

个人而言,我喜欢,因为有人错过下一次===之间的差异的情形产生(我)的第一选择,代码被修改。

+0

+1用于推荐显式的'!= NULL'测试。 – AAT

相关问题