读书人

两层Vector的操作有关问题

发布时间: 2012-06-04 14:48:03 作者: rapoo

两层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如何变化,对于迭代器来讲是没有关系的。
------解决方案--------------------


有人说如果不用迭代器,用下标遍历可能是正常的...如果是这样,请分别指出...
==是正常的,就把它想象成void **p; 指针吧。(如果结构体有动态申请内存,需自己管理释放)


[解决办法]
这段代码是没有问题的。
你自己实现一个简单版的vector就知道了。
[解决办法]
这个显然一点问题都没有,这要有问题,vector就没办法嵌套使用了
[解决办法]
完全没问题。
容器内元素的操作,跟容器本身的操作根本就一点点的关系,LZ的问题本身就是错的。

读书人网 >C++

热点推荐