两层Vector的操作有关问题
两层Vector的操作问题
假设有定义为Vector<vector<T>>的一个名为table的变量...
T可以是int,double等基础类型,也可能是某个结构体或者也可以是指针...
下面的代码
我的观点是:
vector是一个变长的顺序存储容器...
如果push的个数超过某个临界值...会导致vector的重新分配内存以及vector的拷贝...然后在push完了,进行++itrLine的时候就会挂掉...
我认为这是一个不安全的操作,但是可能大部分时间里都不会挂...
也有人认为:
此时的itrLine只是table里面的一个元素,不管push多少个,都只是在改变一个元素的值...
相信stl的容器管理机制,即使重新分配了内存,也会让迭代器指向该指向的地方,所以应该不会挂...
这个操作是安全的...
我想听听大家的观点...
另外:
有人说如果不用迭代器,用下标遍历可能是正常的...如果是这样,请分别指出...
或者如果说不同的编译器对stl的实现会导致不同的结果,也请指出...我现在使用的是VS2008
------解决方案--------------------
你说的情况不会发生
因为你的程序就是错的
当然按照你的理想目标,这样实现是没有问题的
关键是你对迭代器的理解有问题
------解决方案--------------------
请使用正确的方式 不要臆想不正确使用方式可能会出现的情况. 你预料不到. 完全取决于实现.
------解决方案--------------------
不太清楚,坐等高人。。
------解决方案--------------------
我的观点是用迭代器遍历vector时 使用push_back和erase都是错误的。
------解决方案--------------------
------解决方案--------------------
没问题啊。
重新分配空间,只是vector对象内存储各个T的空间变更,并不是vector对象的地址变更。所以,对于vetor<vetor<T>>::iterator 来说,只要vector<vector<T>>对象元素的个数不变,它就不会失效。
------解决方案--------------------
------解决方案--------------------
标准的错误, 迭代器失效.
因为内存的扩增是严格的按照以下次序:
1, operator new分配更大的内存
2, 将原先内存里的对象逐一copy-construct到新内存并destroy原先内存里的对象
3, operator delete释放原先的内存
而vector的迭代器是典型的T*原生指针, 内存都是新开的, T*还能有效吗?
------解决方案--------------------
仅供参考
假设有定义为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对象内存储各个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如何变化,对于迭代器来讲是没有关系的。
------解决方案--------------------