class Index {
public:
Index(){};
Index(int a, float b) {
i = a;
cost = b;
}
Index(int a, float b,int c) {
i = a;
cost = b;
parent_i=c;
}
Index(int a, float b,int c,int d,int e) {
i = a;
cost = b;
parent_i=c;
current_x=d;
current_y=e;
}
int i;//像素坐标所在的下标
float cost=POT_HIGH;//代价直
int parent_i;//sukai
int current_x;//当前像素坐标
int current_y;//当前像素坐标
};
std::vector open_set_; //待遍历的点
2.1倒序输出:
倒序输出 //这里还是it++
for (auto it = open_set_.rbegin(); it != open_set_.rend(); it++){
std::cout<<"倒序输出 open_set_: "<i<<" "<
2.2 sort排序
struct greater1 {
bool operator()(const Index& a, const Index& b) const {
return a.cost > b.cost;
}
};
//把代价最小的数据加入open_set_ 待遍历的点中
//open_set_.push_back(queue_[0]);
open_set_.sort();
open_set_.sort(greater1());
2.3.判断vector中是否包含某个元素 要判断Index类中的一个值为i的元素是否存在于类型为Index的open_set_向量中,可以使用循环迭代遍历向量中的每个元素,然后比较其i的值是否等于目标值。如果找到了匹配的元素,可以返回true表示元素存在,否则返回false表示元素不存在。以下是示例代码:
bool is_element_exist(int target_i, const std::vector& open_set_) {
for (const auto& elem : open_set_) {
if (elem.i == target_i) {
return true;
}
}
return false;
}
上述代码中,is_element_exist函数接受目标i值和open_set_向量作为输入参数,并返回布尔值来指示元素是否存在。循环使用for (const auto& elem : open_set_)语句遍历向量中的每个元素,const auto&用于声明迭代器elem的类型。然后,比较elem.i和target_i的值是否相等,如果是,表示已找到匹配元素,返回true;否则继续循环,直到遍历完整个向量。如果未找到匹配元素,则返回false表示元素不存在。
2.4.判断vector中是否包含某个元素,用std::find函数来做
要判断Index类中的一个值为i的元素是否存在于类型为Index的open_set_向量中,可以使用循环迭代遍历向量中的每个元素,然后比较其i的值是否等于目标值。如果找到了匹配的元素,可以返回true表示元素存在,否则返回false表示元素不存在。用std::find函数来做以下是示例代码:
bool is_element_exist(int target_i, const std::vector& open_set_) {
return std::find_if(open_set_.begin(), open_set_.end(),
[target_i](const Index& elem) { return elem.i == target_i; })
!= open_set_.end();
}
上述代码中,is_element_exist函数的输入和输出与之前的示例代码相同。使用std::find_if算法在向量open_set_中查找具有特定i值的元素。std::find_if的第一个参数是查找的起始位置,这里使用open_set_.begin()表示从向量的起始位置开始查找;第二个参数是查找的结束位置,这里使用open_set_.end()表示到向量的末尾结束查找。第三个参数是一个lambda表达式,用于定义匹配规则。在这里,我们使用[target_i](const Index& elem) { return elem.i == target_i; }来定义一个lambda表达式,该表达式接受一个Index类型的元素作为参数,比较其i值与目标值target_i是否相等。如果相等,返回true表示匹配成功;否则返回false表示匹配失败。std::find_if算法返回一个指向匹配元素的迭代器,如果未找到匹配元素,则返回open_set_.end()迭代器。因此,我们将查找结果与open_set_.end()进行比较,如果不相等,则表示已找到匹配元素,返回true;否则返回false表示元素不存在。
std::vector queue_;
3.1将队列中的元素重新排列,使得优先级最高的元素被移到最后一个位置(小根堆)
//Index top = queue_[0];:获取队列中优先级最高的元素。 // 取出优先队列中的第一个元素(最小势能值),保存到 top 中。
Index top = queue_[0];
//将队列中的元素重新排列,使得优先级最高的元素被移到最后一个位置。 //弹出优先队列中的最小元素,并保持堆的性质。
std::pop_heap(queue_.begin(), queue_.end(), greater1());/
3.2 调整vector队列,使之满足小根堆的性质
//将这个节点放到搜索队列里,并计算该节点的priority(potential值+距离)。
queue_.push_back(Index(next_i, potential[next_i],current_i,current_x,current_y ));
//调整搜索队列,使之满足小根堆的性质,即priority小的节点在队列前面。
std::push_heap(queue_.begin(), queue_.end(), greater1());
3.3删除vector最后一个数据
//弹出队列中的最后一个元素,即优先级最高的元素。 // 删除队列的最后一个元素。
queue_.pop_back();
//queue_.clear();//清空一个存放优先级队列的vector容器queue_。
std::vector close_set; //已经遍历的节点
4.1 查找vector中的数据 已经存在
int index=6;
if(std::find(close_set.begin(), close_set.end(), index)!= close_set.end()){
std::cout<<"/+++++++++++++++///2: 已经在列表中了 :"<