『C/C++养成计划』C++动态数组类vector!

C++动态数组类vector!

一. vector介绍

  • 向量vector是C++标准模板库中的内容。vector是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小。
  • 在程序设计过程中,如果我们知道数组的长度,可以定义静态数组。实际上,我们会经常遇到数组长度在一开始并不能确定的情况,那么这个时候就需要考虑用动态数组了,这样不仅节省了存储的内存,还使得程序更加灵活可靠。
  • vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。
  • vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。

二. 定义和初始化

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> arr1;          //声明一个int型向量
    vector<int> arr2(10);      //声明一个初始大小为10的int型向量
    vector<int> arr3(10, 1);   //声明一个初始大小为10且值都是1的int型向量
    vector<int> arr4 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};   //声明一个int型变量并依次赋值
    vector<int> arr5(arr4);    //声明并用tmp向量初始化vec向量
    vector<int> vec(arr4.begin(), arr4.begin()+3);        //用向量arr4的第0个到第2个值初始化vec向量

    int a[5] = {1, 2, 3, 4, 5};   
    vector<int> vec1(a, a + 5);                        //将arr数组的元素用于初始化vec向量
    vector<int> vec2(&a[1], &a[4]);                    //将arr[1]~arr[4]范围内的元素作为vec的初始值

    vector<vector<int>> vec3;                          //声明一个二维数组
    vector<vector<int>> vec4(4);                       //声明一个4行的二维数组
    vector<vector<int>> vec5(4, vector<int>(5, 6));     //声明一个4行5列的二维数组并赋值维6
    
    system("pause");
    return 0;
}

三. 赋值和获取长度

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> v1{0, 3, 5, 7, 8, 1, 4, 9, 2, 6};     // 赋值时会先清空数组
    vector<int> v2;

    //v2.assign(v1.ita,v1.itb)                   将动态数组v1的[ita,itb)赋值给动态数组v2
    v2.assign(v1.begin(), v1.begin()+8);

    //v.assign(n,p)                              给动态数组v赋值n个元素p
    v2.assign(10, 7);

    vector<int> vec(4);
    int len = vec.size();             // len = 4;获取长度(size)

    system("pause");
    return 0;
}

四. 重置大小(resize)和数组访问

重置大小配合初始化使用,随心所欲设定数组。

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<vector<int>> v1(4);        //声明一个4行的二维数组,对每行分别定义列数为5并赋值
    for(int i=0;i<4;i++){
        v1[i].resize(5, 6);
    }

    vector<vector<int>> array;
    array.resize(3, vector<int>(4));  //修改二维数组大小为3行4列

    system("pause");
    return 0;
}

数组访问有下标访问、迭代器访问、指针访问及其他等方式。

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> v1{1, 2, 3, 4, 5};      //声明一个4行的二维数组,对每行分别定义列数为5并赋值
    
    //1、通过下标访问数组
    for(int i=0;i<v1.size();i++){
        cout<<v1[i]<<" ";
    }
    cout<<endl;
    //2、通过迭代器访问数组
    for(vector<int>::iterator iter=v1.begin(); iter != v1.end(); iter++){
        cout<<*iter<<" ";                        //依次输出 1 2 3 4 5
    }
    cout<<endl;
    //3、通过指针访问数组
    int *p=v1.data();
    for(int i=0;i<v1.size();i++){
        cout<<*p++<<" ";
    }

    system("pause");
    return 0;
}

五. 插入和删除元素

插入元素。

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> v;
    v.push_back(1);  //v.push_back(p)在数组v的末尾添加元素p
    v.push_back(2);               
    v.push_back(3);

    v.insert(v.begin(), 9);
    v.insert(v.begin()+3, 10);
    v.insert(v.end(), 20);

    for(int i=0;i<v.size();i++){
        cout<<v[i]<<" ";
    }
    system("pause");
    return 0;
}

删除元素,使用时,要清楚数组在时刻变化。

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9};
    v.pop_back(); //v.pop_back()删除数组v末尾的元素
    v.pop_back();   
    v.pop_back();

    v.erase(v.begin()); //v.erase(v.it) 删除数组v.it指向位置的元素 
    v.erase(v.begin()+2);
    v.erase(v.end()-1);

    system("pause");
    return 0;
}

六. 交换,反转(swap,reverse)

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
    vector<int> v1{1, 2, 3};
    vector<int> v2{4, 5, 6};
    swap(v1, v2);                   //或者v1.swap(v2),输出结果相同
    reverse(v1.begin(), v1.end());  //反转数组中的元素

    system("pause");
    return 0;
}

七. 排序(sort)

sort(begin, end, cmp),其中begin为指向待sort()的数组的第一个元素的指针,end为指向待sort()的数组的最后一个元素的下一个位置的指针,cmp参数为排序准则,如果没有的话,默认以非降序排序。

  • 默认形式。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
    vector<int> v{0, 3, 5, 7, 8, 1, 4, 9, 2, 6};
    sort(v.begin(), v.end());  //默认情况下升序排列
    for(int i=0;i<v.size();i++){
        cout<<v[i]<<" ";
    }
    cout<<endl;
    system("pause");
    return 0;
}
  • 自定义cmp参数。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

//可自定义排序方式(此为降序)
bool cmp(int &a, int &b){
    return a>b;
}

int main(){
    vector<int> v{0, 3, 5, 7, 8, 1, 4, 9, 2, 6};
    sort(v.begin(), v.end(), cmp);  
    for(int i=0;i<v.size();i++){
        cout<<v[i]<<" ";
    }
    cout<<endl;
    system("pause");
    return 0;
}

八. 清除和空判断(clear,empty)

#include<iostream>
#include<vector>
using namespace std;

int main(){
    vector<int> v{0, 3, 5, 7, 8, 1, 4, 9, 2, 6};
    v.clear();         // v = {};
    v.empty();         // 1  (v为空则输出1)
    system("pause");
    return 0;
}

九. 二分查找算法

对于有序序列,可以采用二分查找法进行查找。它的基本思想是:升序排列的 n n n 个元素集合 a a a 分成个数大致相同的两部分,取 a [ n / 2 ] a[n/2] a[n/2] 与欲查找的 f i n d find find 作比较,如果相等则表示找到 f i n d find find,算法终止。如果 f i n d < a [ n / 2 ] find<a[n/2] find<a[n/2],则在 A A A 的前半部继续搜索 f i n d find find,如果 f i n d > a [ n / 2 ] find>a[n/2] find>a[n/2],则在 A A A 的后半部继续搜索 f i n d find find

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*二分查找 len=序列元素个数 find=欲查找数据*/
int binarySearch(vector<int> &arr, int len, int find)
{
    if (len == 0)
        return -1;
    int low = 0, upper = len - 1, mid;
    while (low <= upper)
    {
        /*不用(upper+low)/2,避免upper+low溢出(因为low+upper都是整形数据,是有界限的)//使用upper-low溢出的可能性大大减少*/
        mid = low + (upper - low) / 2;
        if (find > arr[mid])
            low = mid + 1;
        else if (find < arr[mid])
            upper = mid - 1;
        else
            return mid;
    }
    return -1;
}
int main()
{
    vector<int> arr = {5, 7, 8, 2, 6, 9, 22, 34};
    sort(arr.begin(), arr.end());
    for (int i = 0; i < arr.size(); i++)
        cout << arr[i] << " ";
    cout << endl;
    cout << binarySearch(arr, arr.size(), 22) << endl;
    system("pause");
    return 0;
}
2 5 6 7 8 9 22 34
6
请按任意键继续. . .

参考文章

参考了以下作者的文章,这里表示感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI大模型前沿研究

感谢您的打赏,我会继续努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值