学习了上节string之后,再学习vector会容易很多,他们有很多相似的函数。

1. vector的介绍

vector有点类似C语言的数组,vector使用连续的存储位置来存储其元素
但与数组不同的是,其大小可以动态变化,存储空间由容器自动管理。

2. vector的定义

在这里插入图片描述

vector<typename> v;

上面相当于是定义一维数组v[ ],只不过它的类型可以改变,不仅可以是基本类型int,char,float等还可以是string,vector等标准容器。

下面是定义二维vector数组

vector<vector<int>>  v(num);

在这里插入图片描述

3. vector的初始化

1.花括号直接赋值

vector<int> v{ 1,2,3 };//初始化v为1 2 3

2.圆括号直接赋值

vector<int> v(5);//初始化v为5个0
vector<int> v(5,1);//初始化v为5个1

4. vector的遍历及迭代器的操作

接口名称使用说明
operator[]小标 + []
at(了解)小标 + ()
迭代器begin() + end() 或者 rbegin() + rend()
范围forC++11支持更简单的for遍历(底层还是借用迭代器实现)

①operator[]

对于vector访问最常见的还是对象+[ ]

vector<int> v{ 1,2,3 }; 

v[0] = 1,v[1] = 2,v[2] = 3,

②at

在这里插入图片描述

at与成员 operator[] 不同,operator[] 不进行边界检查,可能会越界访问,at不会。
在这里插入图片描述

③迭代器

接口名称使用说明
begin()返回指向第一个元素的迭代器
end()返回指向最后一个元素的下一个位置的迭代器
rbegin()返回指向最后一个元素的反向迭代器
rend()返回指向第一个元素的前一个位置的反向迭代器

在这里插入图片描述

使用begin,end函数类似于使用指针一样可以访问对象内容

    vector<int> v(5, 3);//初始化5个3
    //正向迭代器遍历容器
    vector<int>::iterator it = v.begin();
   	  while (it != v.end())
      {
        cout << *it << " ";
        it++;
      }
      cout << endl;
      return 0;
     } 

在这里插入图片描述

④范围for

这个书写最方便,底层还是迭代器实现的
在这里插入图片描述

5. vector常见操作

①.push_back()

v.push_back(x):在vector容器v后面添加一个元素x
在这里插入图片描述

②.pop_back()

v.push_back():在vector容器v后面删除最后一个元素

    vector<int> v(5,1);
    v.pop_back();
    //v 变成 1 1 1 1   删除了最后一个1

③.insert()

insert重载很多,感兴趣可以去文档查询
在这里插入图片描述

int main()
{
    int a[] = { 1,2,3,4,5 };
    vector<int> v(a, a + 5);
    // 在第一个位置插入一个10
    v.insert(v.begin(), 10);
    for (auto ch : v)
    {
        cout << ch << " ";
    }
    cout << endl;

    // 在最后一个位置插入5个8
    v.insert(v.end(), 5, 8);
    for (auto ch : v)
    {
        cout << ch << " ";
    }
    cout << endl;

    return 0;
}

在这里插入图片描述

④.erase()

erase()有两种用法:删除指定位置单个元素、删除一个区间内所有元素。
在这里插入图片描述

int main()
{
    vector<int> v{1,2,3,4,5,6};


    // 删除指定位置的元素
    v.erase(v.begin());
    for (auto ch : v)
    {
        cout << ch << " ";
    }
    cout << endl;

    // 删除指定区间的元素
    v.erase(v.begin(), v.begin() + 2);
    for (auto ch : v)
    {
        cout << ch << " ";
    }
    cout << endl;

    return 0;
}

在这里插入图片描述

⑤.swap()

在这里插入图片描述

交换两个容器内容


int main()
{
    vector<int> v1(3, 1);

    vector<int> v2(6, 1);

    swap(v1, v2);

    for (auto ch : v1)
    {
        cout << ch << " ";
    }
    cout << endl;
    for (auto ch : v2)
    {
        cout << ch << " ";
    }
    cout << endl;
    return 0;
}

在这里插入图片描述

⑥.find()

查找操作。需要注意:这个不是 vector 成员函数的接口,这个是算法库里面的,把它放在这里是因为它可以和下面的 insert、erase操作配合使用
可以看到它的功能是:在一个迭代区间里面去寻找特定的val,如果找到这个元素,那就返回当前位置的迭代器;如果找不到,那就返回迭代区间的最后一个位置迭代器

int main()
{
    int a[] = { 1,2,3,4,5,1,2,5,8,6 };
    vector<int> v(a, a + 10);

    vector<int>::iterator pos = find(v.begin(), v.end(), 3);
    if (pos != v.end())
    {
        v.erase(pos);
    }

    for (auto ch : v)
    {
        cout << ch << " ";
    }
    cout << endl;
    return 0;
}

在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐