Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在元组c++;_C++_Multithreading_Boost_Compare_Deque - Fatal编程技术网

C++ 在元组c++;

C++ 在元组c++;,c++,multithreading,boost,compare,deque,C++,Multithreading,Boost,Compare,Deque,我有一组元组: deque<boost::tuple<ppa::Node*, ppa::Node*, ppa::Node*, bool> > deque_wait; 因为我想我可以用这个func来比较两个deques,所以总结一下,我想做的是比较dequeu的第一个元素,与所有的wait,如果满足条件,将bool改为true,它们是不同的done和wait,我之所以要检查它们,是因为这是一个树状结构,它有一个父元素和两个子元素,所以每个元组是,一个父元素和两个子元素,

我有一组元组:

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

因为我想我可以用这个func来比较两个deques,所以总结一下,我想做的是比较dequeu的第一个元素,与所有的wait,如果满足条件,将bool改为true,它们是不同的done和wait,我之所以要检查它们,是因为这是一个树状结构,它有一个父元素和两个子元素,所以每个元组是,一个父元素和两个子元素,我需要看看哪些子元素有一个序列,可以把它准备好,哪些子元素不是,让一个线程来提取它,不管是否需要另一个向量或另一个deque,所以在这种情况下,价格并不重要,谢谢。(:

好的,让我们试一试:

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

这里不需要调用
sort()
,它从技术上比较deque\u wait的每个元素,并根据结果对它们进行排序。要将一个给定值与每个deque元素进行比较,您应该尝试
std::find()
std::find\u if()

//要比较的辅助函数:
结构元组比较
{
//注意:也许它可以使用一些常量
元组&值;
tuple\u compare(tuple&to\u compare):值(to\u compare){
布尔运算符()(元组和第二个)常量
{
//执行任何操作以将原始值与给定参数进行比较
}
};
迭代器pos=find_if(deque_wait.begin()、deque_wait.end()、tuple_compare(deque_done.front());
如果(pos!=deque_wait.end())
//...

据我所知,您的
tuple\u compare
总是返回true,因此它不能用作
std::sort()的标准
。那么你想要实现什么呢?是的,我知道解决方案不是草稿,我想要的是一种方法,将第一个元组与所有其他元组、第二个元组、第三个元组等进行比较,如果满足某些条件,则更改布尔值,当然是在deque中。(:deque_dones的存在有什么原因吗?为什么不在完成时更新原始元组?或者,为什么不在处理元组时将元组移出
deque_wait
队列?没有原因,事实上这就是我寻求帮助的原因,将它们移到哪里?我认为这样更容易看到它是这样的,等待被处理并完成(:根据您提供的信息,它似乎
deque_done
包含同样在
deque_wait
中的元组副本。除非有充分的理由拥有副本,否则不要这样做。而是使用原始元组,并以某种方式表明它已经完成(通过将其移出
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);
//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())
  //...