首页 > 编程语言 >c++复习笔记——STL(vector)

c++复习笔记——STL(vector)

时间:2024-03-03 17:23:37浏览次数:26  
标签:vector STL 元素 asd4 c++ Vector 数组 asd

c++-----STL容器系列(1) vector

1 介绍

Vector是stl容器中一种常见的容器 ,基本和数组类似,其大小(size)可变,常用于数组长度不确定时来代替数组,当数据超过vector预定值时vector将自动扩容。

Vector是一种顺序存储器,在内存中连续排列,可以通过下标访问,时间复杂度为O(1)。

2 创建和使用

使用时需要包含头文件

 1 #include<vector> 

声明一个int型的vector数组

1 Vector<int> asd; 一个空数组
2 Vector<int> asd1 {1,2,3,4,5}; 包含1、2、3、4、5个变量
3 Vector<int> asd2(9); 开辟9个空间,且默认值为0
4 Vector<int> asd3(3,5); 3个值为5的数组
5 Vector<int> asd4(asd3); 复制asd3的所有值
6 Vector<int> asd5(asd4.begin(),asd4.end()); 将asd4的值从头到尾复制
7 Vector<int> asd6(asd4.rbegin(),asd4.rend()); 将asd4的值从未到头复制

 

方法

名字

描述

begin

返回指定容器中第一个元素的迭代器

end

返回指定容器最后一个元素所在位置后一个位置的迭代器

Size

返回实际元素的个数

Max_size

返回元素个数的最大值

empty

判断vector是否为空

at

Vector.at(i)等同于vector[i],访问数组下标的元素

front

返回第一个元素

back

返回最后一个元素

Push_back

在容器尾部插入元素

Pop_back

删除最后一个元素

insert

插入元素

erase

删除元素

swap

两元素交换

capacity

可容纳的大小

3具体用法

3.1 遍历

 1 //范围for循环
 2 for(auto num :asd){
 3 Cout<num<<endl;
 4 }
 5 //下标访问
 6 for(int i=0;i<asd.size();i++){
 7 Cout<<asd[i]<<endl;
 8 }
 9 //迭代器访问
10 for(vector<int>::iterator it=asd.begin();it!=asd.end();it++){
11 cout<<*it<<endl;
12 }

 

3.2容量和大小

resize改变size的大小,而reserve改变capacity的大小

1 Vector<int> asd;
2 Asd.resize(4);
3 Asd.reserve(6);
4 Cout<<asd.size()<<””<<asd.capacity()<<endl;

3.3vector常用算法

3.3.1push_back和pop_back

1 Vector<int> asd;
2 For(int i=0;i<9;i++){
3 Asd.push_back(i);
4 }
5 For(int i=0;i<9;i++){
6 Asd.pop_back();
7 }

3.3.2 erase

erase通过迭代器删除某个或者某个范围的元素,并返回下一个元素的迭代器

1 Vector<int> asd{1.、2、3、4、5、6};
2 Asd.erase(asd.begin()+2);
3 //删除asd开头往后偏移两个位置的元素

3.3.3 swap和clear

1 vector<int> asd={5,4,3,2,1};
2 Vector<int> asd1={1,2,3,4,5};
3 Asd.swap(asd1);
4 //swap将两个vector进行交换
5 Asd.clear();
6 //clear清空整个vector,size变为0

3.4 vector二维操作

定义一个二位的数组

 1 Vector<vector<int>> asd; 

定义一个5行三列且全为1的二维数组

 1 Vector<vector<int>> asd(5,vector<int>(3,1)); 

访问

 1 //For循环访问
 2 For(int i=0;i<asd.size();i++){
 3 For(int j=0;j<asd[0].size();j++){
 4 Cout<<asd[i][j]<<endl;
 5 }
 6 }
 7 For(auto nums :asd){
 8 For(auto num :nums){
 9 Cout<<num<<endl;
10 }
11 }

4 vector扩容原理

扩容原理概述

  • 新增元素:vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素;
  • 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器都失效;
  • 初始时刻vector的capacity为0,塞入第一个元素后capacity增加到1;
  • 在不同编译器实现的扩容方式不一样,VS015中以1.5倍扩容,GCC以2倍扩容

以下是vs中vector的扩容源码

总结

  • vector在push_back以成倍增长可以在均摊后达到O(1)的事件复杂度,相对于增长指定大小的O(n)时间复杂度更好。
  • 为了防止申请内存的浪费,现在使用较多的有2倍与1.5倍的增长方式,而1.5倍的增长方式可以更好的实现对内存的重复利用。

标签:vector,STL,元素,asd4,c++,Vector,数组,asd
From: https://www.cnblogs.com/157184lcy/p/18050302

相关文章

  • C++ 函数调用运算符 () 重载
    函数调用运算符()可以被重载用于类的对象。当重载()时,您不是创造了一种新的调用函数的方式,相反地,这是创建一个可以传递任意数目参数的运算符函数。1#include<iostream>2usingnamespacestd;3classDistance4{5private:6intfeet;/......
  • C++ 赋值运算符'='重载
    C++拷贝构造函数(初学有点难理解)就像其他运算符一样,可以重载赋值运算符(=),用于创建一个对象,比如拷贝构造函数。1#include<iostream>2usingnamespacestd;3classDistance4{5private:6intfeet;//0到无穷7intinches;......
  • C++ ++ 和 -- 运算符重载
    原文递增运算符(++)和递减运算符(--)是C++语言中两个重要的一元运算符。1、递增和递减一般是改变对象的状态,所以一般是重载为成员函数。2、重载递增递减,一定要和指针的递增递减区分开。因为这里的重载操作的是对象,而不是指针(由于指针是内置类型,指针的递增递减是无法重载的),......
  • C++中UNIX时间戳与日期互转
    C++中UNIX时间戳与日期互转使用time.h头文件localtime可以把时间戳转为tm结构体,tm结构体中可以格式化输出时间mktime可以把tm结构体转为时间戳tm结构体中:year需要+1900,tm_mon的范围是0-11,tm_mday的范围是1-31structtm{inttm_sec;//secondsaftert......
  • pytorch报错:Variable._execution_engine.run_backward( # Calls into the C++ engine
    GPU模式下运行pytorch代码报错,pytorch为2.2.1,NVIDIA驱动版本535.161.07File"/home/devil/anaconda3/envs/sample-factory/lib/python3.11/site-packages/torch/_tensor.py",line522,inbackwardtorch.autograd.backward(File"/home/devil/anaconda3/envs/sample-......
  • C++新U4-贪心算法1
    学习目标贪心算法的概念[【贪心算法(一)】书架]    【题意分析】选出最少的奶牛数量,让他们的身高相加超过书架的高度。【思路分析】优先选择身高高的奶牛,这样子奶牛使用的数量最少。定义排序规则,将数从大到小排序定义奶牛数量n和书架高度b,并且输入输......
  • C++第二课 while循环
    循环while(条件){   循环体}#include<bits/stdc++.h>usingnamespacestd;intmain(){   inti,s;   i=1;   s=0;   while(i<=100)   {      s=s+i;      i=i+1;   }   cout<<s<<endl;   return0;}计算1......
  • 是学习c++还是java?
    上高中时,自己第一次接触到学校的中华学习机和苹果机,当时中华学习机上可以进行basic编程,那时候自己其实就爱上编程,但是没有人指点,也学习不得法,所以就没有进行下去!大学时,自己的主攻专业并不是计算机,但是学习了《计算机基础》和《c程序设计》,前者主要学习dos命令和wps文字处理,后者主......
  • C++第一课 输出Hello World
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ }这是一个固定的格式,记住就行了。#include<bits/stdc++.h>usingnamespacestd;intmain(){   cout<<"Hello,World!"<<endl;   return0;}这是一个简单的输出Hello,World! #include<bits/stdc......
  • Qt/C++音视频开发67-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流
    一、前言音视频组件除了支持保存MP4文件外,同时还支持保存裸流即264/265文件,以及解码后最原始的yuv文件。在实际使用过程中,会发现部分视频文件保存的裸流文件,并不能直接用播放器播放,查阅资料得知原来是缺少sps/pps信息,监控行业的rtsp/rtmp/录像mp4文件都是会带的,所以很少遇到这个......