找出下面迭代器错误的使用方式:
int main(){
vector<int> v1,v2;
set<int> s1,s2;
for(int i=0;i<10;i++){
v1.push_back(i);
v2.push_back(i);
s1.insert(i);
s2.insert(i);
}
//A
vector<int>::iterator it1=v1.begin();
while(it1!=v1.end()){
v1.erase(it1++):
}
//B
vector<int>::iterator it2=v2.begin();
while(it2!=v2.end()){
it2=v2.erase(it2);
}
//C
set<int>::iterator it3=s1.begin();
while(it3!=s1.end()){
s1.erase(it3++);
}
//D
set<int>::iterator it4=s2.begin();
while(it4!=s2.end()){
it4=s2.erase(it4);}
}
- 对容器进行删除操作时,容器中元素的数量发生变化,这种变化可能会导致某些元素的物理地址发生改变,使指向这些元素的迭代器失效,但是并非所有容器的添加删除操作都会导致迭代器失效。
- vector的删除操作都会导致迭代器失效。向vector中插入元素时,end迭代器一定失效,因为最后一个元素已经发生变化。如果插入时vector中原空间已满,vector会重新申请空间并将所有元素拷贝到新空间,由于vector中所有元素都移动了位置,因此会导致所有迭代器失效,包括first迭代器和end迭代器。
- 从vector中删除元素时会导致被删除元素及其后面所有的迭代器失效,包括end迭代器,而被删除元素之前的迭代器不受影响,包括first迭代器。删除元素操作会使被删除元素之后所有元素向前移动,end迭代器也会随之前移,因此原来指向这些元素的迭代器都会失效。
- list的操作不会导致任何迭代器失效,删除操作只会导致被删除元素的迭代器失效。由于list容器的底层是链表,相连表中删除元素不会影响其他结点的物理位置,因此只想其他元素的迭代器不会失效,包括first迭代器和end迭代器。
- deque的删除操作都会导致迭代器失效。在deque的首部删除元素会导致first迭代器失效;在deque的尾部删除元素会导致end迭代器失效;在deque的任意位置删除元素可能导致部分迭代器失效,可能包括first迭代器和end迭代器。
- 在deque的首部删除元素只会影响第一段数据空间的第一个有效元素;在deque的尾部删除元素只会影响最后一段数据空间的最有一个有效元素;在deque的任意位置删除元素会导致多段数据空间的元素整体发生移动。
- set和map的操作不会导致迭代器失效,删除操作只会导致被删除元素的迭代器失效。由于set和map容器的底层使红黑树,向红黑树中删除元素不会影响其他结点的物理位置,因此指向其他元素的迭代器不会失效,包括forst迭代器和end迭代器。
- 综上,A错误,BCD正确。