C ++将元素插入向量

Posted

技术标签:

【中文标题】C ++将元素插入向量【英文标题】:C++ insert an element to a vector 【发布时间】: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 【参考方案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 章)如下:

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

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

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

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

std::priority_queue<int> q;

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

【讨论】:

我知道priority_queue,但我正在学习数据结构。所以我想用向量或列表来处理。

以上是关于C ++将元素插入向量的主要内容,如果未能解决你的问题,请参考以下文章

关于将元素插入向量的 C++ 问题

C++ 将元素从一个向量移动到另一个向量

C++ 向量和列表插入

C++ - 在自定义数据类型向量中按值匹配和替换元素

堆栈/堆中的向量元素?长输入,C++

C语言 二维数组的线性存储特性