定义如下的类
class CA
{
public:
void fun1()
{
for(vector<int>::iterator iter = m_v1.begin(); iter != m_v1.end(); iter++)
{
if(*iter == 7)
{
fun2();
}
}
}
void fun2()
{
m_v1.push_back(999);
}
protected:
vector<int> m_v1;
vector<int>::iterator m_iter;
private:};
在你使用fun1()的时候,在循环中push,iter就会有问题, 如何解决这个问题呢. 
程序有可能嵌套很多,就是你不能保证循环中不push, 这个问题比较麻烦.

解决方案 »

  1.   

    不能这样弄。vector不能用游标来进行循环内修改。可以改一下:class CA
    {
    public:
    void fun1()
    {
    for(int i = 0; i < m_v1.size(); i++)
    {
    if(m_v1[i] == 7)
    {
    fun2();
    }
    }
    }
    void fun2()
    {
    m_v1.push_back(999);
    }
    protected:
    vector<int> m_v1;
    vector<int>::iterator m_iter;
    private:};
      

  2.   

    同意楼上,因为你push_back之后,原先的 iterator可能已经无效,因为vector可能会涉及内存的重新allocate ,所以在 iter++的时候有可能会报错,所以,最好用at 或者 [] 来
      

  3.   

    先同意以上做法
    最好把 for(int i = 0; i < m_v1.size(); i++)
    改成:
    int nSize = m_v1.size(); 
    for(int i = 0; i < nSize ;i++)
    减少不必要的循环和提高访问效率因为每次都要去访问m_v1.size(); 而且还会变。
      

  4.   

    STL的容器有个问题,你添加或删除了元素,有可能迭代器就失效了.
      

  5.   

    序列容器有这个问题.
    list, map 等不存在这个问题
      

  6.   

    m_v1.size 是 内联的,不影响效率.