STL container 容易发作的bug
STL中,container和其iterator是正交的,我们操作iterator的时候不知道container。而在具体的程序中,两者却往往有相交性,比如常见的bug就是在itertator的遍历中又修改了container(常见于观察者模式),STL不检查这个,而因为其正交性,这种bug很难发现和定位,又是undefined behavor,往往导致事后错误,更加错的无迹可寻。
简单的,把container和其iterator封装在一起就可以解决(应该说是更早的发现而不是解决)这样的问题。简单举个例
template <typename C> class LoopSafeContainer { bool m_in_loop; C m_c; public: LoopSafeContainer(){ m_in_loop = false; } void clear(){ m_c.clear(); } size_t size() const{ return m_c.size(); } template <typename Item> void push_back(Item i) { assert_exp(!m_in_loop); m_c.push_back(i); } template <typename Item> bool remove(Item i) { assert_exp(!m_in_loop); size_t sz = m_c.size(); m_c.remove(i); return sz - 1 == m_c.size(); } template <typename Func> void for_all(Func f) { m_in_loop = true; for (auto it = m_c.begin(); it != m_c.end(); ++it) f(*it); m_in_loop = false; } };
代码简单不解释了(另:没有auto可能写的苦了)。对于常见的应用来讲,的确无需把iterator暴露出来。