简述:
头文件—vector,vector是STL里的容器之一,与数组一样,内存空间连续,起始地址不变,能在O(1)做到随机存取。但添加和删除元素需要拷贝则时间为O(n),数组的大小为定义时分配,但vector可以实现动态增长,程序员可以不用考虑容量问题。size返回已用容量大小,capacity返回总空间大小,若capacity与size相等,vector则会分配新内存,拷贝原空间,释放原空间,新分配内存为原内存的两倍,但程序效率不高,我们可以用reserve(n)预先分配一定大小的空间。
定义:
vector<int> ve; vector<int>::iterator it;//迭代器 vector<int>::reverse_iterator rit;//逆向迭代器
vector基本操作: /*x为元素,pos,sta,end为迭代器*/
(1)容量:
•向量大小:ve.size();
•向量判空:ve.empty();
• 向量清空:ve.claer();
(2)修改:
•ve.push_back(x); 末尾添加
•ve.pop_back(x); 末尾删除
•ve.insert(pos,x); 在pos位置插入x
•ve.erase(pos); 删除pos位置的元素
•ve.erase(sta,end); 删除[sta,end]之间的元素
•ve.assign(n,x); 将ve变成n个x
•ve.assign(sta,end); 将ve2的[sta,end)拷贝到ve
•reverse(sta,end); 将[sta,end)的元素翻转
(3)查询:
•ve.begin(); 首迭代器
•ve.end(); 末迭代器
•ve.rbegin(); 末位元素的迭代器
•ve.rend(); 首位元素往前一个的迭代器
•ve.front(); 首元素
•ve.at(index); index下标的元素
•find(sta,end,x); 在[sta,end)中查找x,找到返回迭代器位置,找不到返回end()
(4)遍历:
//通过迭代器: for(it=ve.begin();it!=ve.end();it++){ cout<<*it<<" "; }
//通过下标 for(int i=0;i<ve.size();i++){ cout<<ve[i]<<" "; }
//通过迭代器,这样连it也不用声明了 for(auto it=ve.begin(); it!=ve.end(); it++) { cout<<*it<<" "; }
// 通过auto for(auto it:ve) { cout<<it<<" "; }
//it为元素的拷贝,若要修改原元素则要使用&it 元素则要使用&it
去重:
sort(ve.begin(),ve.end()); ve.erase(unique(ve.begin(),ve.end()), ve.end()); //unique()函数将重复的元素放到vector的尾部 然后返回指向第一个重复元素的迭代器 再用erase函数擦除从这个元素到最后元素的所有的元素