本文整理汇总了C++中typenamestd::vector::setPrevious方法的典型用法代码示例。如果您正苦于以下问题:C++ vector::setPrevious方法的具体用法?C++ vector::setPrevious怎么用?C++ vector::setPrevious使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类typenamestd::vector
的用法示例。
在下文中一共展示了vector::setPrevious方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: AStar
std::list<STATE> AStar(const STATE& start, const STATE& target,
boost::function<void (const STATE&, const STATE&,
const STATE&,
std::vector<STATE>&,
std::vector<STATE>&)>
generate_next_states)
{
//std::cout<<"start A* ------------------"<<std::endl;
std::set<STATE> open;
std::set<STATE> closed;
STATE current = start;
while ( current.moreCost() > 0.0000001f ){
//std::cout<<"state: "<<current.p()<<std::endl;
typename std::set<STATE>::iterator iter = closed.begin();
for(; closed.end() != iter; ++iter){
if ( iter->sameAs(current) ) break;
}
if ( closed.end() == iter ){
// insert to closed
closed.insert(current);
}
iter = open.begin();
for(; open.end() != iter; ++iter){
if (iter->sameAs(current)){
open.erase(iter);
break;
}
}
std::vector<STATE> nextStates, unReach;
generate_next_states(current, target, target, nextStates, unReach);
//std::cout<<"next size: "<<nextStates.size()<<std::endl;
for( typename std::vector<STATE>::iterator iter=nextStates.begin();
nextStates.end()!=iter; ++iter){
typename std::set<STATE>::iterator citer = closed.begin();
for(; citer != closed.end(); ++citer){
if ( citer->sameAs(*iter) ) break;
}
if ( closed.end() != citer ){
//std::cout<<"the state "<<iter->p()
//<<"have been closed"<<std::endl;
continue; // the state have be closed
}
iter->setPrevious(current);
typename std::set<STATE>::iterator oiter = open.begin();
for(; oiter != open.end(); ++oiter){
if ( oiter->sameAs(*iter) ) break;
}
if ( open.end() == oiter ){
//std::cout<<"insert "<<iter->p()
//<<" ("<<iter->cost()<<")"<<std::endl;
open.insert(*iter); // first reach this state
}
else{
if ( oiter->cost() > iter->cost() ){
//std::cout<<"refresh "<<iter->p()
//<<" "<<oiter->cost()<<" -> "
//<<iter->cost()<<std::endl;
// find a better path to reach this state
open.erase(oiter);
open.insert(*iter);
}
}
}
if ( open.empty() ){
//std::cout<<"no path! open empty"<<std::endl;
break; // no path!
}
// start from the best state at currently
current = *open.begin();
}
std::list<STATE> path;
while ( !start.sameAs(current) )
{
path.push_front(current);
STATE previous = current.previous();
typename std::set<STATE>::const_iterator p = closed.begin();
for(; p!=closed.end(); ++p ){
if ( previous.sameAs(*p) ) break;
}
if ( closed.end() == p ){
//std::cout<<"no path! closed empty"<<std::endl;
// no path: closed empty!
break;
}
current = *p;
}
//std::cout<<"end A* ----------------"<<std::endl;
return path;
//.........这里部分代码省略.........