【数据结构】vector用法
1.初始化:
vector<类型>标识符
vector<类型>标识符(最大容量)
vector<类型>标识符(最大容量,初始所有值)
int i[5]={1,2,3,4,5}
vector<类型>vi(i,i+2);//得到i索引值为3以后的值
vector<vector<int>>v; 二维向量//这里最外的<>要有空格。否则在比较旧的编译器下无法通过
2.常用函数
push_back() //在数组的最后添加一个数据
pop_back() //去掉数组的最后一个数据
at() //得到编号位置的数据
begin() //得到数组头的指针
end() //得到数组的最后一个单元+1的指针
find() //判断元素是否存在
front() //得到数组头的引用
back() //得到数组的最后一个单元的引用
max_size() //得到vector最大可以是多大
capacity() //当前vector分配的大小
size() //当前使用数据的大小 or 返回a在内存中总共可以容纳的元素个数
a.reserve(100); //改变当前vecotr所分配空间的大小将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100
a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,增加的元素其值默认为0
a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,增加的元素其值为2
erase() //删除指针指向的数据项
clear() //清空当前的vector
rbegin() //将vector反转后的开始指针返回(其实就是原来的end-1)
rend() //将vector反转构的结束指针返回(其实就是原来的begin-1)
empty() //判断vector是否为空
swap() //与另一个vector交换数据
a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换
reverse(obj.begin(),obj.end());反向迭代器,实现元素对调
3.find用法
find(数组的头地址, 数组的尾地址, 要找的数)
find(nums.begin(), nums.end(), target)
//返回的是target第一次出现的地址
//如果没有找到返回尾地址nums.end()
实例
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using std::vector;
using std::cout;
using std::endl;
int main() {
vector<int> nums = {2,7,8,8,9};
int target = 8;
vector<int>::iterator loc = find(nums.begin(), nums.end(), target);
if (loc == nums.end()) {
cout << "数组中没有" << target << endl;
}
else {
cout << "数组中有" << target << endl;
cout << "并且, 它的第一次出现的位置为:" << loc - nums.begin() << endl;
}
}
4.访问
#include <bits/stdc++.h>
using namespace std;
int main()
{
//顺序访问
vector<int>obj;
for(int i=0;i<10;i++)
{
obj.push_back(i);//存储数据
}
//方法一数组访问
cout<<"直接利用数组:";
for(int i=0;i<10;i++)
{
cout<<obj[i]<<" ";
}
cout<<endl;
//方法二,使用迭代器将容器中数据输出
cout<<"利用迭代器:" ;
vector<int>::iterator it;
//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素
for(it=obj.begin();it!=obj.end();it++)
{
cout<<*it<<" ";
}
return 0;
}
5.insert插入
insert() //往vector任意位置插入一个元素,指定位置或者指定区间进行插入,
//第一个参数是个迭代器,第二个参数是元素。返回值是指向新元素的迭代器
vector<int> vA;
vector<int>::iterator it;
//指定位置插入
//iterator insert(const_iterator _Where, const _Ty& _Val)
//第一个参数是个迭代器位置,第二个参数是元素
it = vA.insert(vA.begin(),2); //往begin()之前插入一个int元素2 (vA={2,1}) 此时*it=2
//指定位置插入
//void insert(const_iterator _Where, size_type _Count, const _Ty& _Val)
//第一个参数是个迭代器位置,第二个参数是要插入的元素个数,第三个参数是元素值
it = vA.insert(vA.end(),2,3);//往end()之前插入2个int元素3 (vA={2,1,3,3}) 此时*it=3
//指定区间插入
//void insert(const_iterator _Where, _Iter _First, _Iter _Last)
vector<int> vB(3,6); //vector<类型>标识符(最大容量,初始所有值)
it = vA.insert(vA.end(),vB.begin(),vB.end()); //把vB中所有元素插入到vA的end()之前 (vA={2,1,3,3,6,6,6})
//此时*it=6,指向最后一个元素值为6的元素位置
//删除元素操作:
pop_back() 从vector末尾删除一个元素
erase() 从vector任意位置删除一个元素,指定位置或者指定区间进行删除,第一个参数都是个迭代器。返回值是指向删除后的下一个元素的迭代器
clear() 清除vector中所有元素, size=0, 不会改变原有capacity
6.排序
sort(v.begin(), v.end(),less<int>()); // 升序
sort(v.begin(), v.end(),greater<int>()); // 降序
7.删除元素
-
\(erase()\) 函数:
\(erase()\) 函数用于在顺序型容器中删除容器的一个元素,有两种函数原型,\(c.erase (p ),c.erase(b,e);\) 第一个删除迭代器 \(p\) 所指向的元素,第二个删除迭代器 \(b,e\) 所标记的范围内的元素,\(c\) 为容器对象,返回值都是一个迭代器,该迭代器指向被删除元素后面的元素(这个是重点)
for(auto iter=vec.begin();iter!=vec.end(); ) {
if( *iter == 3) iter = veci.erase(iter);//当删除时erase函数自动指向下一个位置,就不需要进行++
else iter ++ ; //当没有进行删除的时候,迭代器++
}
-
\(remove()\) 函数:
\(remove\) 是个stl的通用算法
std::remove(first,last,val)
移除 \([first, last)\) 范围内等于 \(val\) 的元素在\(vector\) 里面用就类似于iter=std::remove(vec.begin(), vec.end(), val)
但这个函数只是把 \(val\) 移到\(vec\) 的末尾,并不真正删除,真正删除还是要调用一次erase函数
veci.erase(remove(vec.begin(),vec.end(),3),vec.end());
- 重复元素