0

我想做以下事情:

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         }
4

4 回答 4

3
if (Arrival *arrival = aid.arrival(event))
    time_heap.insert(arrival);
于 2012-09-07T05:54:14.397 回答
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);

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

于 2012-09-07T06:30:27.700 回答
0

您应该能够删除与 NULL 的比较,因为 NULL 被认为是 0 值,因此是错误的。给定“x =aid.arrival(event)”,您可以选择if(x){time_heap.insert(x);}

于 2012-09-07T05:54:20.850 回答
-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;
}
于 2012-09-07T06:17:04.460 回答