【问题标题】:C++ insert an element to a vectorC ++将元素插入向量
【发布时间】:2017-05-19 10:15:12
【问题描述】:

我正在尝试使用存储每个元素的向量来构建优先级队列。首先,我想将元素插入到具有优先级的向量中。我不确定是否有可能,如果没有,有人可以给我另一种解决方案。 这是我的代码:

template <typename E>
class PriorityQueue {
private:
    std::vector<E> elements;
    E value;
    int pr; 

public:
  PriorityQueue() {}

  void insert(int priority, E element) {


  }   
};

【问题讨论】:

  • 使用 std::priority_queue
  • 没有魔法。根据要插入的优先级搜索位置,然后插入。
  • @PriyeshKumar 这具有线性复杂性,可以对数(摊销)完成。
  • 我建议也看看 std::push_heap 和 std::pop_heap

标签: c++ algorithm c++11


【解决方案1】:

这里是如何为向量创建一个具有优先级的元素:

 struct PriElement
    {
        int data;
        int pri;
        bool operator < ( const PriElement & other ) const
        {
            return pri < other.pri;
        }
    };

    vector<PriElement> _vector;

然而,真正的问题是保持向量按优先级排序。

这是一个显示冒泡方法的简单实现:

class PriorityQueue{

public:
    void insert( int data, int pri )
    {
        _vector.push_back(PriElement(data,pri));
        int index = _vector.size() -1;
        while ( ( index > 0 )&& (_vector[index] < _vector[index-1] ) )
        {
            swap(_vector[index],_vector[index-1]);
            index--;
        }

    }
private:

    vector<PriElement> _vector;
};

如前所述,对于任何现实世界的实现,请使用 priority_queue。

【讨论】:

  • 感谢您的解决方案,非常感谢。如果可能的话,我可以使用 min-heap 来插入吗,这意味着我必须在插入之前对其进行 heapify。我不确定我的想法是否有意义
  • 这就是上面的代码所做的,heapify up,但是对于一个向量。 Heapify 通常指的是应用于 BST 的相同进程(顺便说一下,priority_queue 是什么。)
  • operator &lt; 应该是const
【解决方案2】:

执行此操作的标准算法(参见Introduction To Algorithms 第 6 章)如下:

  1. 当推动一个项目时,将它插入到向量的末尾,然后将它“冒泡”到正确的位置。

  2. 当弹出最小的项目时,将第一个项目(位置 0)替换为最后的项目,然后将其“冒泡”到正确的位置。

有可能表明这可以用(摊销的)对数时间来完成(摊销是由于向量本身可能加倍)。

但是,没有必要自己实现,因为标准库包含std::priority_queue,这是一个使用std::vector 作为其默认序列容器的容器适配器。例如,如果您定义

std::priority_queue<int> q;

那么q 将是一个适应向量的优先级队列。

【讨论】:

  • 我知道priority_queue,但我正在学习数据结构。所以我想用向量或列表来处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多