std::vector的其它操作

                         std::vector的其它操作

1.定义一个Index类作为vector的参数:

    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;//当前像素坐标
    };

2.创建vector

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表示元素不存在。

3.创建vector

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_。

4.创建vector

   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: 已经在列表中了     :"<

你可能感兴趣的:(ros,c++,小根堆,vector,排序,查找)