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())
//...