#include
跟数组一样可以用下标[i]的形式访问元素,但是切记赋值的时候如果一开始没有为其分配空间的话,是不能以下标[i]的形式进行赋值的,因为此时var[i]不存在,可以采用insert(位置指针,value)或者直接arr.push_back(value)。
1.vector 基本语法:
定义:vector arr;
定义:vector ::iterator it=arr.begin();
新元素:value
//指向向量arr的第一个元素。
1.push_back 在数组的最后添加一个数据
arr.push_back(value);
2.pop_back 去掉数组的最后一个数据
arr.pop_back(); 切记无返回值,最后一个元素会直接销毁
3.at 得到编号位置的数据
value=arr.at(key) reference at(int pos) 返回pos位置元素的引用
4.begin 得到数组头的指针
it=arr.begin()
5.end 得到数组的最后一个单元+1的指针
it=arr.end() 返回的是指向最后一个元素的下一个位置的指针
6.front 得到数组头的引用
value=arr.front() 直接得到该向量首元素的引用
7.back 得到数组的最后一个单元的引用
value=arr.back() 直接得到该向量最后一个元素的引用
8.max_size 得到vector最大可以是多大
9.capacity 当前vector分配的大小
10.size 当前使用数据的大小
length=arr.size()
11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve 改变当前vecotr所分配空间的大小
13.erase 删除指针指向的数据项
arr.erase(it)
14.clear 清空当前的vector
15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty 判断vector是否为空
arr.empty();
18.swap 与另一个vector交换数据
2.遍历一维vector:
for(vector<int>:: iterator it=arr.begin();it!=arr.end();it++)
{
cout<<*it<<" ";
}
或者可以采用数组下标遍历的形式
for(int i=0;i<arr.size()-1;i++)
{
cout<<arr[i]<<" ";
}
遍历二维vector
//在这里arr是二维向量;
vector<vector<int>> arr;
for(vector<vector<int>>:: iterator iter=arr.begin();iter!=arr.end();iter++)
{
vector<int> temp=*iter;
for(vector<int>:: iterator it=temp.begin();it!=temp.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
//或者也可以直接用遍历下标的形式
for(int i=0;i<arr.size();i++)
{
vector<int> temp=arr[i];
for(int j=0;j<temp.aize();j++)
{
cout<<temp[j]<<" ";
}
cout<<endl;
}
3.删除元素:
//删除最后一个;
arr.pop_back();
//删除指针指向的一个;
arr.erase(it);
//删除指定的一段;
vector<int>:: iterator first, last;
arr.erase(first,last);
//其中[first,last)均为指针
4.增加元素
(1)
arr.insert(it,value); //表示在it指向的元素之前插入value;
(2)
arr.push_back(value); //直接在arr最后插入value;
5.遍历:
reference at(int pos):返回pos位置元素的引用
reference front():返回首元素的引用
reference back():返回尾元素的引用
iterator begin():返回向量头指针,指向第一个元素
iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
reverse_iterator rbegin():反向迭代器,指向最后一个元素
reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
6.判断函数
bool empty() const:判断向量是否为空,若为空,则向量中无元素
7.大小函数
int size() const:返回向量中元素的个数
int capacity() const:返回当前向量所能容纳的最大元素值
int max_size() const:返回最大可允许的vector元素数量值
一道题目
例题:
题目描述
设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能
set(key, value):将记录(key, value)插入该结构
get(key):返回key对应的value值
[要求]
set和get方法的时间复杂度为O(1)
某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。
当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。
若opt=1,接下来两个整数x, y,表示set(x, y)
若opt=2,接下来一个整数x,表示get(x),若x未出现过或已被移除,则返回-1
对于每个操作2,输出一个答案
class Solution {
public:
/**
* lru design
* @param operators int整型vector<vector<>> the ops
* @param k int整型 the k
* @return int整型vector
*/
void set(int key,int value,vector<vector<int>> &lru,int k)
{
vector<int> a;
a.push_back(key);
a.push_back(value);
if(lru.size()==k)
{
lru.pop_back();
lru.insert(lru.begin(), a);
}
else if(lru.size()<k)
{
lru.insert(lru.begin(), a); //插入最前面
}
}
int get(vector<vector<int>> &lru,int key) //存在并且使用时候要将其放在最开始的位置;
{
vector<vector<int>>::iterator iter=lru.begin();
vector<int> temp;
for(iter=lru.begin();iter!=lru.end();iter++)
{
temp=*iter;
if(temp[0]==key)
{
lru.erase(iter);
lru.insert(lru.begin(), temp);
return temp[1];
break;
}
else
continue;
}
return -1;
}
vector<int> LRU(vector<vector<int> >& operators, int k) {
// write code here
vector<int> output;
int num=0;
vector<vector<int>> lru; //用于保存<=k个的当前缓存
vector<vector<int>>::iterator iter;
vector<int> temp;
for(iter=operators.begin();iter!=operators.end();iter++)
{
temp=*iter;
if(temp[0]==1) //set
{
set(temp[1],temp[2],lru, k);
}
else if(temp[0]==2) //get
{
output.push_back(get(lru,temp[1]));
}
}
return output;
}
};