[英]Abstract over deque and vector in C++ (using iterators?)
因此,我正在編寫一個圖形遍歷例程,並且希望能夠通過選擇FIFO或LIFO鄰居遍歷策略將其轉換為深度優先或寬度優先的遍歷。 實際上,這意味着我需要在std::deque
和std::vector
(或堆棧)上抽象“入隊”和“出隊”操作。
通過具有幾個專門用於這些容器的模板功能,可以很容易地做到這一點。 但是,我想知道:在STL中是否有規范的方法可以做到這一點? 看起來我可以將back_insert_iterator
用於“入隊”,但是找不到“ front_remove_iterator
用於“出隊”。 我有想念嗎?
它已經作為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));
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.