While I was unit testing my code, I want to check whether the queue does contain any search string found in the queue. Thus, I have a QueuePath which storing some text and then iterate the queue with following way, it failed.
typedef queue<wstring> QueuePath;
QueuePath::iterator it;
for( it=list.begin(); it != list.end(); it++ ) {
…
}
This will hit compilation error because an iterator isn’t a member of the queue, thus a better resolution would be to use deque. Since my earlier design was started with queue, I didn’t really want to change it for now. While searching for a solution, I had discovered the new trick in ideone.com which is to iterate the queue. This trick is a work around for the queue to support the iterator interface.#include <deque>
#include <queue>
using namespace std;
template< typename T, typename Container=std::deque<T> >
class MyQueue : public queue<T,Container>
{
public:
typedef typename Container::iterator iterator;
iterator begin() { return this->c.begin(); }
iterator end() { return this->c.end(); }
};
int _tmain(int argc, _TCHAR* argv[])
{
MyQueue<int> q;
for (int i = 0; i < 10; i++)
q.push(i);
for (auto it = q.begin(); it != q.end(); it++)
cout << *it << endl;
return 0;
}
Although this workaround is damn real cool, but I was so reluctant to change my code. Anyway, think about it, do I really need this just for the unit testing? Basically, I could have something like below to get my job accomplished since I’m working on the unit test.while( !list.empty() ) {
…
list.pop();
}
Remember my objective? The objective of this unit test is to make sure that the content in the queue was correct.

No comments:
Post a Comment