C++ vector详细内容(自己老是忘记,自用)

#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;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43978754/article/details/115231956