STL-vector函数的使用

STL-vector函数的使用

话不多说,开始进入正式环节:

  • 头文件自然是#include

  • 定义 vector v; 当然有需求二维甚至更高也可以定义 vector > myv

  • 接下来就是一些列的常用函数:

    1. 判断是否为空:v.empty();

    2. 查看vector内数据量的大小:v.size();

    3. 尾部压入数据:v.push_back(date);

    4. 尾部弹出数据:v.pop_back()

    5. 清空vector内的数据,但是空间保留:v.clear();

    6. 在某个pos之前的位置插入num个val:v.inxert(pos,num,val);

    7. 对vector中元素进行排序:sort(v.begin(),v.end()),借助于头文件#include 中的sort函数,方便快捷由小到大进行排序

      • 大多数人都认为sort底层应该是快排,但其实并不如此
        - 通常会设置一个SORT_MAX(通常为16),当排序元素的个数小于SORT_MAX,使用插入排序,避免快排递归调用带来额外负荷;当递归层次过深时,则采用堆排序;其余情况才是用我们所谓的快排来进行排序;
        STL-vector函数的使用_第1张图片
        快速排序:

        #include 
        #include 
        using namespace std;
        
        int partition(vector<int> &nums,int left, int right){
            int key=nums[left];
            while(left<right){
                while(left<right&&key<nums[right]) right--;
                if(left<right) nums[left++]=nums[right];
                while(left<right&&key>nums[left]) left++;
                if(left<right) nums[right--]=nums[left];
            }
            nums[left]=key;
            return left;
        }
        
        void quick_sort(vector<int> &nums,int left, int right){
            if(left>right) return;
            int k=partition(nums,left,right);
            quick_sort(nums,left,k-1);
            quick_sort(nums,k+1,right);
        }
        

        插入排序:

        #include 
        #include 
        using namespace std;
        
        void insert_sort(vector<int> &nums){
            for(int i=1; i<nums.size(); i++){
                for(int j=i-1; j>=0&&nums[j+1]<nums[j]; j--){
                    swap(nums[j],nums[j+1]);
                }
            }
        }
        

        堆排序:

        #include 
        #include 
        using namespace std;
        
        void adjust_heap(vector<int> &nums, int node, int len){
            int left_son = 2*node + 1;
            int right_son = 2*node + 2;
            int maxIdx = node;
            if(left_son<len && nums[left_son] > nums[maxIdx]) maxIdx = left_son;
            if(right_son<len && nums[right_son] > nums[maxIdx]) maxIdx = right_son;  
            if(maxIdx != node){
                swap(nums[maxIdx], nums[node]);
                adjust_heap(nums, maxIdx, len);       
            }
        }
        
        void heap_sort(vector<int> &nums){
            for(int i=nums.size()/2-1; i>=0; i--){
                adjust_heap(nums,i,nums.size());
            }
            for(int j=nums.size()-1; j>0; j--){
                swap(nums[0],nums[j]);
                adjust_heap(nums,0,j);
            }
        }
        
    8. 删除其中的某个元素:v.erase(v.begin()+pos);这里需要注意删除其中元素会导致迭代器的失效,要注意调整迭代器的位置:

      • 假设删除其中为5倍数的元素:

        `for(auto ite=v.begin(); ite!=v.end(); ite++){  
        	if(*ite%5==0){
         		v.erase(ite);
         		ite--; 
         		}
         }`
        

        删除元素后,后面的数据会依次向前进一位,也就是说下一个要检查的元素仍然位于当前下标处,所以需要进行减减操作,保证下一次判断的还是原位置的新元素STL-vector函数的使用_第2张图片

    9. 判断某个元素是否存在:auto ite=find(v.begin(),v.end(),findDate);

    10. 获取末尾数字 :int date=v.back();

  1. vector常问问题:
    1. 底层实现:动态数组的形式进行数据的存储
    2. 如何进行内存分配:通过比较内部的数据量大小(size)和申请的内存大小(capacity),当size

你可能感兴趣的:(STL-vector函数的使用)