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暴露出来。
浙公网安备 33010602011771号