容器之vector
1.vector介绍
(1).vector是表示可变大小数组的序列容器;
(2).vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对 vector 的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。容量不够时,会主动申请空间进行增容,这时旧空间的数据需要拷贝到新空间中。
2.vector使用
构造函数、拷贝构造、析构函数、迭代器、容量空间、增删查改接口
3.vector迭代器失效
(1).迭代器失效:就是原生空间释放后,再次去访问使用,触发编译器程序错误。
迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个 指针 ,或者是对指针进行了 封装(后面介绍到的list就是这样的) ,比如: vector 的迭代器就是原生态指针 T* 。因此 迭代器失效,实际就是迭代器底层对应指针所指向的 空间被销毁了,而使用一块已经被释放的空间 ,造成的后果是程序崩溃 ( 即 如果继续使用已经失效的迭代器, 程序可能会崩溃 ) 。(2). 会引起其底层空间改变的操作,都有可能是迭代器失效 ,比如: resize 、 reserve 、 insert 、 assign 、 push_back等。指定位置元素的删除操作 - -erasev.erase(pos);// 删除pos位置的数据,导致pos迭代器失效。 cout << *pos << endl; // 此处会导致非法访问
#include <iostream> using namespace std; #include <vector> int main() { int a[] = { 1, 2, 3, 4 }; vector<int> v(a, a + sizeof(a) / sizeof(int)); // 使用find查找3所在位置的iterator vector<int>::iterator pos = find(v.begin(), v.end(), 1); // 删除pos位置的数据,导致pos迭代器失效。 v.erase(pos); cout << *pos << endl; // 此处会导致非法访问 return 0; } //解决方法 #include <iostream> using namespace std; #include <vector> int main() { int a[] = { 1, 2, 3, 4 }; vector<int> v(a, a + sizeof(a) / sizeof(int)); // 使用find查找3所在位置的iterator vector<int>::iterator pos = find(v.begin(), v.end(), 1);//找对象v中 是否有1 // 删除pos位置的数据后,后面的数据需要往前移动,进行补齐 erase(pos)的返回值是一个迭代器,返回给pos,就可以再次访问了,如果不返回给pos,再次访问迭代器失效,就会导致非法访问 //cout << &*pos << endl; pos=v.erase(pos);//解决方法 //cout << &*pos << endl; cout << *pos << endl; // 此处不会导致非法访问 return 0; }
※注意:防止迭代器失效解决办法:在使用前,对迭代器重新赋值即可。