0

私はこのタプルの両端キューを持っています:

 deque<boost::tuple<ppa::Node*, ppa::Node*, ppa::Node*, bool> > deque_wait;

そして、私は要素を1つずつ他の要素と比較できるようにしたいと思います。

deque<boost::tuple<ppa::Node*, ppa::Node*, ppa::Node*, bool> > deque_done;

これは、どのノードが実行されているかを確認してから、スレッドにリストの次のノードを選択させて、それを使って何かを実行させたいためです。私が持っているコードは次のとおりです。

このようなことをしようとしています:

 bool tuple_compare(boost::tuple<ppa::Node*, ppa::Node*, 
 ppa::Node*, bool> &tuple_to_check)
 {
  for(int i = 0; i < deque_wait.size(); i++) {

      boost::tuple<ppa::Node*, ppa::Node*, ppa::Node*, bool> tuple_compare = deque_wait.at(i);
      ppa::Node *father = boost::get<0>(tuple_compare);
      ppa::Node *son = boost::get<0>(tuple_compare);
      ppa::Node *second_son = boost::get<2>(tuple_compare);

      bool has_seq = boost::get<3>(tuple_compare);

      cout << "checking " << boost::get<1>(tuple_to_check)->get_name() << " "
              << boost::get<2>(tuple_to_check)->get_name() << " " 
              << boost::get<0>(tuple_compare)->get_name() << endl;
  }

  return true;

}

スレッド機能:

 void wait_function(void)
 {
  try {

  } catch (boost::lock_error &le)
  {
      cout << le.what() << " from " << boost::this_thread::get_id() << endl;
  }

  }

ミューテックスが必要であることを知っています。それらを計画しました。今のところ、dequeの要素を他の要素と比較して、特定の条件を満たすかどうかを確認し、実行する方法を知る必要があります。現在、比較は次のような並べ替え関数:

sort(deque_wait.begin(), deque_wait.end(), tuple_compare);

この関数を使用して2つの両端キューを比較できるとはいえ、要約すると、deque_doneの最初の要素をすべての待機と比較し、条件が満たされた場合は、boolをtrueに変更します。完了して待ってください。このツリーのような構造には親と2つの息子があるため、各タプルには、親と2つの息子があり、どの息子がそれを準備するためのシーケンスを持っているかを確認する必要があります。スレッドが来てそれを拾うのはそうではありませんが、ベクトルや別の両端キューのような別のものが必要かどうかは関係ありません。したがって、この場合、価格は重要ではありません。(:

4

1 に答える 1

0

OK、試してみましょう:

私がやりたいのは、deque_doneの最初の要素をすべての待機と比較し、条件が満たされた場合にブール値をtrueに変更することです。

ここで必要なのは呼び出しsort()ではありません。技術的には、deque_waitの各要素を相互に比較し、結果に従って順序付けます。1つの指定された値を各deque要素と比較するにはstd::find()、またはを試す必要がありstd::find_if()ます。

//Helper functor to compare:
struct tuple_compare
{
  //note: maybe it could use some const's
  tuple<...>& value;
  tuple_compare(tuple<...>& to_compare) : value(to_compare) {}
  bool operator()(tuple<...>& second) const
  {
    //do anything to compare the original value with the given parameter
  }
};

deque<...>::iterator pos = find_if(deque_wait.begin(),deque_wait.end(),tuple_compare(deque_done.front()));
if(pos!=deque_wait.end())
  //...
于 2012-07-26T10:34:56.837 に答える