0

私は次のことをしたい:

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

つまり、返された値がaid.arrival(event)time_heap でない場合は、その値を 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

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

NULL は 0 値と見なされ、したがって false と見なされるため、NULL との比較を削除できるはずです。「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 ラムダ (または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 に答える