0

所以我正在编写一个图遍历例程,我希望能够通过选择 FIFO 或 LIFO 邻居遍历策略将其转换为深度优先或广度优先遍历。在实践中,这意味着我需要在std::dequestd::vector(或堆栈)上抽象“入队”和“出队”操作。

这可以通过为这些容器专门设置几个模板函数来轻松完成。但是,我想知道:在 STL 中是否有一种规范的方法来实现这一点?看起来我可以使用back_insert_iterator“入队”,但我没有找到front_remove_iterator“出队”。我错过了什么吗?

4

1 回答 1

0

这已经作为std::stack和存在std::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));
    }
};
于 2018-07-20T09:48:20.810 回答