How can I improve this code?
template<class T>
class Queue {
public:
Queue(const std::initializer_list<T>& i) :elem{i} {}
int size() const {
return elem.size();
}
bool empty() const {
return elem.empty();
}
void enqueue(T&&);
void dequeue();
T peek();
T& operator[](std::size_t);
typename std::vector <T>::iterator begin() {
return elem.begin();
}
typename std::vector <T>::iterator end() {
return elem.end();
}
private:
std::vector<T> elem;
};
template<class T>
void Queue<T>::enqueue(T&& t) {
elem.push_back(t);
}
template<class T>
void Queue<T>::dequeue() {
if (empty()) {
throw std::out_of_range("underflow");
}
elem.erase(elem.begin());
}
template<class T>
T Queue<T>::peek() {
if (empty()) {
throw std::out_of_range("underflow");
}
return elem.front();
}
template<class T>
T& Queue<T>::operator[](std::size_t i) {
if (empty() || i < 0 || i >= size()) {
throw std::out_of_range("underflow");
}
return elem[i];
}
std::queue<T>
instead? Then you get iterators too. \$\endgroup\$std::deque
if you need efficient insertion/removal at both ends. \$\endgroup\$std::queue
by default just wraps astd::deque
. I achieved substantial performance improvements recently by replacing aqueue
with adeque
. \$\endgroup\$