STL容器vector
一、什么是Vector
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
二、定义和初始化Vector对象
//初始化vector对象的方法 vectorV1; vector v2(v1); vector v3 = v2; vector v4(n, val); vector v5(n); vector v6{a, b, c}; vector v7 = {1, 2, 3};
三、增加函数
void push_back(const T& x); //向量尾部增加一个元素X iterator insert(iterator it,const T& x); //向量中迭代器指向元素前增加一个元素x iterator insert(iterator it,int n,const T& x); //向量中迭代器指向元素前增加n个相同的元素x iterator insert(iterator it,const_iterator first,const_iterator last); //向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
1、使用push_back,将一个元素追加到vector的尾部
#include#include<string> #include using namespace std; int main(){ vector<string> v1; string str; while(cin >> str){ v1.push_back(str); } for(auto x : v1){ //范围for语句 cout << x << " "; } cout << endl; return 0; }
2、insert函数允许在容器任何位置插入一个或多个元素,每个Insert函数接收迭代器作为其第一个参数,指出在容器什么位置放置新元素。
#include#include<string> #include using namespace std; int main(){ vector<string> v1; vector<string> v2 = {"z3", "w5", "y2"}; string str; v1.insert(v1.begin(), "Hello"); v1.insert(v1.end(), 3, "World"); //插入范围元素 v1.insert(v1.begin(), v2.begin(), v2.end()); //接收一对迭代器,将范围中的元素插入 for(auto x : v1){ cout << x << " "; } cout << endl; return 0; }
通过insert的返回值,可以在一个特定位置反复插入元素
四、删除函数
iterator erase(iterator it);//删除向量中迭代器指向元素 iterator erase(iterator first,iterator last);//删除向量中[first,last)中元素 void pop_back();//删除向量中最后一个元素 void clear();//清空向量中所有元素
1、删除vector中所有奇数元素
#include#include using namespace std; int main(){ vector<int> v1 = {1, 2, 3, 4, 5}; auto it = v1.begin(); while(it != v1.end()){ if(*it % 2) it = v1.erase(it); else ++it; } for(auto x : v1){ cout << x << " "; } cout << endl; return 0; }
2、删除一个范围内的所有元素
五、其他函数
void swap(vector&);//交换两个同类型向量的数据 void assign(int n,const T& x);//设置向量中前n个元素的值为x void assign(const_iterator first,const_iterator last);//向量中[first,last)中元素设置成当前向量元素
六、迭代器失效
迭代器失效是指迭代器底层对应的指针所指的空间无效了,而使用一块已经被释放的空间,造成的后果是程序崩溃。
1、扩容导致迭代器失效。vector插入元素可能会导致容量不足,会触发扩容,导致整个vector重新申请内存,并且将原有的数据复制到新的内存中,并将原有内存释放,迭代器所指的内存释放,迭代器失效。
#include#include using namespace std; int main(){ vector<int> v1; v1.push_back(6); v1.push_back(9); auto it = v1.begin(); cout << "v1的容量为:" << v1.capacity() << endl; //容量为2 cout << *it << endl; v1.push_back(10); //扩容,迭代器失效 v1.push_back(5); cout << "v1的容量为:" << v1.capacity() << endl; cout << *it << endl; return 0; }
2、insert导致迭代器失效
#include#include using namespace std; int main() { vector<int> ta; for (int i = 0; i < 13; i++) { ta.push_back(i); } vector<int>::iterator it = ta.begin(); it += 5; cout << "容量是 " << ta.capacity() << endl; cout << "it的值是 " << *it << endl; ta.insert(it, 100); cout << "insert后容量是 " << ta.capacity() << endl; cout << "此时it指向的值是 " << *it << endl; return 0; }
3、erase导致迭代器失效
#includeusing namespace std; #include int main() { vector<int> ta; for (int i = 0; i < 10; ++i) { ta.push_back(i); } vector<int>::iterator it = ta.begin(); it += 5; cout << "容量是 " << ta.capacity() << endl; cout << "it的值是 " << *it << endl; ta.erase(it); //迭代器失效 cout << "erase后容量是 " << ta.capacity() << endl; cout << "此时it指向的值是 " << *it << endl; return 0; }
对于序列式容器,比如vector,插入删除当前的iterator会使后面所有元素的iterator都失效。