vector 向量容器入门

欢迎前往我的个人博客阅读原文

在刷 LeetCode 的过程中,如果使用 c++ 进行提交,基本上都会遇到 vector 向量容器。由于以前学习 c++ 的过程中,没有涉及到容器的相关概念,一直都对 vector 一头雾水,所以我决定深入学习一些 c++ 的知识,今天就从 vector 向量容器开始。

vector 向量容器不但能像数组一样对元素进行随机访问,还能在尾部插入元素,是一种简单、高效的容器,完全可以替代数组。而且,vector 具有内存自动管理的功能,对于元素的插入和删除,可动态调整所占的内存空间。

使用 vector 向量容器,需要头文件包含声明

#include<vector>

创建 vector 对象

创建 vector 对象常用的有三种形式:

  • 不指定容器的元素个数,如

    vector<int> v;
    
  • 创建时,指定容器的大小,如:

    vector<double> v(10);
    
  • 创建一个具有 n n n 个元素的向量容器对象,每个元素具有指定的初始值,如:

    vector<double> v(10, 8.6);
    

    上述语句定义了 v 向量容器,共有 10 个元素,每个元素的值是 8.6。

尾部元素扩张

通常使用 push_back() 对 vector 容器在尾部追加新元素,既可对空的 vector 容器对象扩张,也可对有元素的 vector 容器对象扩张,vector 容器会自动分配新的内存空间。

#include<vector>
using namespace std;
int main(int argc, char* argv[])
{
    vector<int> v;
    v.push_back(4);
    v.push_back(7);
    v.push_back(6);
    return 0;
}

上述例子中,将 4,7,6 三个元素从尾部添加到 v 容器中,这样,v 容器中就有三个元素,依次是 4,7,6。

下标方式访问 vector 元素

对于 vector 对象,类似于数组的访问,可以采用下标方式随意访问它的某个元素,也可以以下标方式对某元素重新赋值。

#include<vector>
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
    vector<int> v(3);
    v[0] = 4;
    v[1] = 7;
    v[2] = 6;
    cout << v[0] << ' ' << v[1] << ' ' << v[2] << endl;
    return 0;
}

上面的代码采用下标方式进行赋值,再输出元素的值 4,7,6。

使用迭代器访问 vector 元素

使用迭代器配合循环语句对 vector 对象进行遍历访问,迭代器的类型一定要与它要遍历的 vector 对象的元素类型一致。(虽说我还不知道迭代器是啥,先学吧,以后再补充)。

#include<vector>
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
    vector<int> v(3);
    v[0] = 4;
    v[1] = 7;
    v[2] = 6;
    // 定义迭代器变量
    vector<int>::iterator it;
    for (it = v.begin(); it != v.end(); it++)
    {
        // 输出迭代器上的元素值
        cout << *it << ' ';
    }
    cout << endl;
    return 0;
}

上面的代码采用迭代器对 vector 进行了遍历,输出 4,7,6。

元素的插入

insert() 方法可以在 vector 对象的任意位置前插入一个新的元素,同时,vector 自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置。

注意insert() 方法要求插入的位置,是元素的迭代器位置,而不是元素的下标。

#include<vector>
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
    vector<int> v(3);
    v[0] = 4;
    v[1] = 6;
    v[2] = 7;
    // 在最前面插入新元素,元素值为 8
    v.insert(v.begin(), 8);
    // 在第 2 个元素前插入新元素 1
    v.insert(v.begin() + 2, 1);
    // 在向量末尾追加新元素 3
    v.insert(v.end(), 3);
    // 定义迭代器变量
    vector<int>::iterator it;
    for (it = v.begin(); it != v.end(); it++)
    {
        // 输出迭代器上的元素值
        cout << *it << ' ';
    }
    cout << endl;
    return 0;
}

上面的代码输出的结果是 8,4,1,6,7,3。

vector 容器有两个重要的方法,begin()end()begin() 返回的是首元素位置的迭代器;end() 返回的是最后一个元素的下一个元素位置的迭代器。

元素的删除

  • erase() 方法可以删除 vector 中迭代器所指的一个元素或一段区间中的所有元素。
  • clear() 方法则一次性删除 vector 中的所有元素。

下面的代码演示了 vector 元素的删除方法:

#include<vector>
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
    vector<int> v(10);
    // 给向量赋值
    for (int i = 0; i < 10; i++)
        v[i] = i;
    // 删除第 2 个元素,从 0 开始计数
    v.erase(v.begin() + 2);
    // 定义迭代器变量
    vector<int>::iterator it;
    for (it = v.begin(); it != v.end(); it++)
    {
        // 输出迭代器上的元素值
        cout << *it << ' ';
    }
    cout << endl;
    // 删除迭代器第 1 到第 5 区间的所有元素
    v.erase(v.begin() + 1, v.begin() + 5);
    for (it = v.begin(); it != v.end(); it++)
        cout << *it << ' ';
    cout << endl;
    // 清空向量
    v.clear();
    // 输出向量大小
    cout << v.size() << endl;
    return 0;
}

运行结果:

0 1 3 4 5 6 7 8 9
0 6 7 8 9
0

向量的大小

  • 使用 size() 方法可以返回向量的大小,即元素的个数。
  • 使用 empty() 方法返回向量是否为空。

下面这段代码演示了 size() 方法和 empty() 的用法:

#include<vector>
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
    vector<int> v(10);
    // 给向量赋值
    for (int i = 0; i < 10; i++)
        v[i] = i;
    // 输出向量的大小,即包含了多少个元素
    cout << v.size() << endl;
    // 输出向量是否为空,如果非空,则返回逻辑假,即 0,否则返回逻辑真,即 1
    cout << v.empty() << endl;
    // 清空向量
    v.clear();
    cout << v.empty() << endl;
    return 0;
}

运行结果:

10
0
1

与反向、排序算法的结合

首先需要声明以下头文件:

#include<algorithm>

使用 reverse 反向排列算法

reverse 算法可以将向量中某段迭代器区间元素反向排列,如

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main(int argc, char* argv[])
{
    vector<int> v(10);
    // 给向量赋值
    for (int i = 0; i < 10; i++)
        v[i] = i;
    // 反向排列向量的从首到尾间的元素
    reverse(v.begin(), v.end());
    // 定义迭代器变量
    vector<int>::iterator it;
    for (it = v.begin(), it != v.end(); it++)
    {
        // 输出迭代器上的元素值
        cout << *it << ' ';
    }
    cout << endl;
    return 0;
}

使用 sort 算法对向量元素排序

sort 算法要求使用随机访问迭代器进行排序,在默认情况下,对向量元素进行升序排列。

#include<vector>
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
    vector<int> v;
    int i;
    // 赋值
    for (i = 0; i < 10; i++)
        v.push_back(9 - i);
    // 输出排序前的元素值
    for (i = 0; i < 10; i++)
        cout << v[i] << ' ';
    cout << endl;
    // 排序,升序排列
    sort(v.begin(), v.end());
    // 输出排序后的元素值
    for (i = 0; i < 10; i++)
        cout << v[i] << ' ';
    cout << endl;
    return 0;
}

还可以自己设计排序比较函数,然后,把这个函数指定给 sort 算法,那么,sort 就根据这个比较函数指定的排序规则进行排序。下面的程序子集设计了一个排序比较函数 Comp,要求对元素的值由大到小排序:

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
// 自己设计排序比较函数:对元素的值进行降序排列
bool Comp(const int &a, const int &b)
{
    if (a != b)
        return a > b;
    else
        return a > b;
}
int main(int argc, char* argv[])
{
    vector<int> v;
    int i;
    // 赋值
    for (i = 0; i < 10; i++)
        v.push_back(i);
    // 输出排序前的元素值
    for (i = 0; i < 10; i++)
        cout << v[i] << ' ';
    cout << endl;
    // 按 Comp 函数比较规则排序
    sort(v.begin(), v.end(), Comp);
    // 输出排序后的元素值
    for (i = 0; i < 10; i++)
        cout << v[i] << ' ';
    cout << endl;
    return 0;
}

以上便是向量的一些常用的方法,可以达到简单的入门。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值