簡體   English   中英

C ++中的雙端隊列和向量摘要(使用迭代器?)

[英]Abstract over deque and vector in C++ (using iterators?)

因此,我正在編寫一個圖形遍歷例程,並且希望能夠通過選擇FIFO或LIFO鄰居遍歷策略將其轉換為深度優先或寬度優先的遍歷。 實際上,這意味着我需要在std::dequestd::vector (或堆棧)上抽象“入隊”和“出隊”操作。

通過具有幾個專門用於這些容器的模板功能,可以很容易地做到這一點。 但是,我想知道:在STL中是否有規范的方法可以做到這一點? 看起來我可以將back_insert_iterator用於“入隊”,但是找不到“ front_remove_iterator用於“出隊”。 我有想念嗎?

它已經作為std::stackstd::queue 令人討厭的是,它們之間的接口並不完全相同,但是可以解決。 這也為修復void pop()疣提供了機會。

template <typename Traversal, typename T, typename Container>
struct GraphNeighbors;

template<typename T, typename Container=std::deque<T>>
struct GraphNeighbors<class FIFO, T, Container>
{
private:
    std::queue<T, Container> nodes;
public:
    T pop() 
    { 
         T elem = std::move(nodes.front()); 
         nodes.pop(); 
         return elem; 
    }
    void push(const T & elem)
    {
        nodes.push(elem);
    }
    void push(T&& elem)
        nodes.emplace(std::move(elem));
    }
};

template<typename T, typename Container=std::deque<T>>
struct GraphNeighbors<class LIFO, T, Container>
{
private:
    std::stack<T, Container> nodes;
public:
    T pop() 
    { 
         T elem = std::move(nodes.top()); 
         nodes.pop(); 
         return elem; 
    }
    void push(const T & elem)
    {
        nodes.push(elem);
    }
    void push(T&& elem)
        nodes.emplace(std::move(elem));
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM