两层Vector的操作有关问题

两层Vector的操作问题
假设有定义为Vector<vector<T>>的一个名为table的变量...
T可以是int,double等基础类型,也可能是某个结构体或者也可以是指针...


下面的代码
C/C++ code

vector<vector<T>> table;

for(vector<vector<T>>::iterator itrLine = table.begin(); itrLine != table.end(); ++itrLine)
{
    itrLine.push_back(T);
    ...    // 可能push任意个T
           // 假设内存是理想的,不会内存不足
}

// 我的疑问是
// 1,这个循环结束了以后table还是正常的吗?
// 2,假设初始化了足够多的元素...把push换成erase呢?



我的观点是:
vector是一个变长的顺序存储容器...
如果push的个数超过某个临界值...会导致vector的重新分配内存以及vector的拷贝...然后在push完了,进行++itrLine的时候就会挂掉...
我认为这是一个不安全的操作,但是可能大部分时间里都不会挂...

也有人认为:
此时的itrLine只是table里面的一个元素,不管push多少个,都只是在改变一个元素的值...
相信stl的容器管理机制,即使重新分配了内存,也会让迭代器指向该指向的地方,所以应该不会挂...
这个操作是安全的...

我想听听大家的观点...

另外:
有人说如果不用迭代器,用下标遍历可能是正常的...如果是这样,请分别指出...
或者如果说不同的编译器对stl的实现会导致不同的结果,也请指出...我现在使用的是VS2008

------解决方案--------------------
你说的情况不会发生
因为你的程序就是错的
当然按照你的理想目标,这样实现是没有问题的
关键是你对迭代器的理解有问题
------解决方案--------------------
请使用正确的方式 不要臆想不正确使用方式可能会出现的情况. 你预料不到. 完全取决于实现.
------解决方案--------------------
不太清楚,坐等高人。。
------解决方案--------------------
我的观点是用迭代器遍历vector时 使用push_back和erase都是错误的。
------解决方案--------------------
探讨

引用:

我的观点是用迭代器遍历vector时 使用push_back和erase都是错误的。


遍历一维的vector我很肯定会出问题
erase的返回值赋给迭代器还可以正常遍历...

但是二维我觉得很难说...

------解决方案--------------------
没问题啊。
重新分配空间,只是vector对象内存储各个T的空间变更,并不是vector对象的地址变更。所以,对于vetor<vetor<T>>::iterator 来说,只要vector<vector<T>>对象元素的个数不变,它就不会失效。
------解决方案--------------------
探讨

没问题啊。
重新分配空间,只是vector对象内存储各个T的空间变更,并不是vector对象的地址变更。所以,对于vetor<vetor<T>>::iterator 来说,只要vector<vector<T>>对象元素的个数不变,它就不会失效。

------解决方案--------------------
标准的错误, 迭代器失效.

因为内存的扩增是严格的按照以下次序:

1, operator new分配更大的内存
2, 将原先内存里的对象逐一copy-construct到新内存并destroy原先内存里的对象
3, operator delete释放原先的内存

而vector的迭代器是典型的T*原生指针, 内存都是新开的, T*还能有效吗?
------解决方案--------------------
仅供参考
C/C++ code
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
    p=(int **)malloc(4*sizeof(int *));
    if (NULL==p) return;
    for (i=0;i<4;i++) {
        p[i]=(int *)malloc(5*sizeof(int));
        if (NULL==p[i]) return;
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            p[i][j]=i*5+j;
        }
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            printf(" %2d",p[i][j]);
        }
        printf("\n");
    }
    for (i=0;i<4;i++) {
        free(p[i]);
    }
    free(p);
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19

------解决方案--------------------
么有错误。。。。一张二维表。。。。。table的首级指针去寻找table的vector<T>元素指针,然后元素指针对各个单vector进行操作
------解决方案--------------------
table里面保存的实际都是vector<T>类型的指针,所以itrLine如何变化,对于迭代器来讲是没有关系的。
------解决方案--------------------