0

我有这个元组双端队列:

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

我希望能够将这些元素与其他元素一一进行比较:

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

  }

我知道需要互斥体,我已经计划好了,现在我只需要知道如何将双端队列的元素与其他元素进行比较,看看它们是否满足某些条件并运行它们,现在的比较正在与排序功能,如:

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

因为我虽然可以使用这个函数来比较两个双端队列,所以总而言之,我想做的是将 deque_done 的第一个元素与所有等待进行比较,如果满足条件,则将 bool 更改为 true,它们是不同的完成并等待,我想检查它们的原因是因为这是一个树状结构有一个父节点和 2 个儿子,所以每个元组都是这样,一个父节点和 2 个儿子,我需要看看哪些儿子有一个序列准备好做和哪些不是让线程来接它,是否需要其他东西(如向量或另一个双端队列)并不重要,所以在这种情况下价格并不重要,谢谢。(:

4

1 回答 1

0

好的,让我们试一试:

我想要做的是将 deque_done 的第一个元素与所有等待进行比较,如果满足条件,则将 bool 更改为 true,

在这里调用sort()不是你需要的——它在技术上将 deque_wait 的每个元素相互比较,并根据结果对它们进行排序。要将一个给定值与每个双端队列元素进行比较,您应该尝试std::find()or 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 回答