我想做以下事情:
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 }
答案 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;
}