【C++】vector的使用下

简介: **C++ 中的 `std::vector` 概要:**- **元素获取:** 支持 `operator[]`(越界时不检

🔥元素获取

在这里插入图片描述
vector对象的元素同时支持以下几种元素获取方式

==operator[ ]重载,at访问,front获取首元素,back获取尾元素==

operator[]at获取元素的区别:当下标越界时,使用operator[]获取报错at获取抛异常

代码案例:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
   
   
    vector<int> vec({
   
    1,2,3,4 });
    for (int i = 0; i < vec.size(); i++) {
   
   
        cout << vec[i] << " ";
        cout << vec.at(i) << " ";
    }
    cout << endl;

    cout << vec.front() << " ";
    cout << vec.back() << endl;
    return 0;
}

在这里插入图片描述

🔥容量接口

在这里插入图片描述

通过这些接口可以获取当前对象容量信息。

==size==

在这里插入图片描述

size_type size() const;

返回vector中的元素个数。
这个vector对象返回的元素个数size并不一定等于capacity。

代码案例:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
   
   
    vector<int> myints;
    cout << "0. size: " << myints.size() << '\n';

    for (int i = 0; i < 10; i++) myints.push_back(i);
    cout << "1. size: " << myints.size() << '\n';

    myints.insert(myints.end(), 10, 100);
    cout << "2. size: " << myints.size() << '\n';

    myints.pop_back();
    cout << "3. size: " << myints.size() << '\n';

    return 0;
}

在这里插入图片描述

==capacity==

在这里插入图片描述

size_type capacity() const;

获取vector对象的容量大小。当你对vector对象执行元素插入,空间不够时,会自动改变capacity并扩容。

代码案例:

// 比较size和capacity
#include <iostream>
#include <vector>
using namespace std;
int main()
{
   
   
    vector<int> myvector;

    // set some content in the vector:
    for (int i = 0; i < 100; i++) myvector.push_back(i);

    cout << "size: " << (int)myvector.size() << '\n';
    cout << "capacity: " << (int)myvector.capacity() << '\n';

    return 0;
}

在这里插入图片描述
有关size和capacity的大小问题,不同编译器的实现不同,运行上面代码过程中产生的结果也可能不同。
任何情况下,size都是小于等于capacity的

==reserve==

在这里插入图片描述

void reserve (size_type n);

reserve可以用来改变vector对象的容量capacity
但不会影响size以及当前对象已有元素。

代码案例:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
   
   
    vector<int> v({
   
    1,2,3,4 });
    cout << v.size() << endl;
    cout << v.capacity() << endl;
    cout << endl;

    v.reserve(30);
    cout << v.size() << endl;
    cout << v.capacity() << endl;

    return 0;
}

在这里插入图片描述

==resize==

在这里插入图片描述

void resize (size_type n, value_type val = value_type());

resize可以用来改变vector的size

当n小于size时,将内容减少到其前n个元素,删除超出它们的元素。

当n大于size时,对于vector对象中已经存在的元素不做改动,对于尚未定义的元素空间用val填充。

当n大于capacity时,则会重新分配内存空间(扩容)。

代码案例:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
   
   
    vector<int> v({
   
    1,2,3,4 });
    cout << v.size() << endl;
    cout << v.capacity() << endl;
    cout << endl;

    v.resize(15, -1);
    cout << v.size() << endl;
    cout << v.capacity() << endl;

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

    return 0;
}

在这里插入图片描述

reserve负责开辟空间,当知道需要多少空间时,可以帮助缓解vector增容的代价。
resize在开辟空间时会初始化,同时影响size。

reserve和resize都不会进行缩容,如果有缩容需要,可以使用shrink_to_fit();

==empty==

在这里插入图片描述
判断vector对象是否为空,为空返回1,非空返回0。简单说:判断size是否为0

🔥vector对象增删查改

在这里插入图片描述

==push_back==

在这里插入图片描述

尾插一个元素,capacity不够时自动扩容

==pop_back==

在这里插入图片描述
尾删一个元素

代码案例:

#include<vector>
using namespace std;
int main()
{
   
   
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    for (int i = 0; i < v.size(); i++) {
   
   
        cout << v[i] << " ";
    }
    cout << endl;

    cout << v[v.size() - 1] << " ";
    v.pop_back();
    cout << v[v.size() - 1] << " ";
    v.pop_back();
    cout << v[v.size() - 1] << " ";

    cout << endl;
    cout << v.size() << endl;

    return 0;
}

在这里插入图片描述

==insert==

在这里插入图片描述

insert用于在指定位置插入元素。

此方法有三个重载形式:

single element (1)

iterator insert (iterator position, const value_type& val);

将元素val插入到迭代器position指向的元素之前
如果position指向end();迭代器,则将元素添尾插
同时,此函数存在一个返回值,指向新插入的元素。

fill (2)

void insert (iterator position, size_type n, const value_type& val);

此方法在position指向元素之前插入n个val元素
无返回值

range (3)

template <class InputIterator>
    void insert (iterator position, InputIterator first, InputIterator last);

此方法将位于[first,last)区间的元素按顺序插入到position指向的元素之前
无返回值。

代码案例:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
   
   
    vector<int> v({
   
    1,2,3,4 });

    vector<int>::iterator it = v.begin() + 1;

    // (1)
    it = v.insert(it, 100);
    for (auto e : v) cout << e << " ";
    cout << endl;

    // (2)
    v.insert(it, 3, 0);
    for (auto e : v) cout << e << " ";
    cout << endl;

    // (3)
    v.insert(v.end(), v.begin() + 1, v.begin() + 4);
    for (auto e : v) cout << e << " ";
    cout << endl;

    return 0;
}

在这里插入图片描述

==erase==

在这里插入图片描述
可以删除一个迭代器指向的元素,也可以删除一个迭代器区间内的元素

iterator erase (iterator position);

iterator erase (iterator first, iterator last);

这两个函数都存在一个返回值,返回被删除部分的下一个元素(如果没有下一个元素,则为end())的迭代器。

代码案例:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
   
   
    vector<int> v({
   
    1,2,3,4 });

    vector<int>::iterator it = v.begin() + 1;
    cout << *it << " ";

    it = v.erase(it);
    cout << *it << endl;

    it = v.erase(it, v.end());
    if (it == v.end())
        cout << "it == v.end()" << endl;

    return 0;
}

在这里插入图片描述

==clear==

在这里插入图片描述
删除vector对象中的所有元素,同时将size置零。

代码案例:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
   
   
    vector<int> v({
   
    1,2,3,4 });
    cout << v.size() << endl;
    for (auto e : v)cout << e << " ";
    cout << endl;

    v.clear();
    cout << v.size() << endl;
    for (auto e : v)cout << e << " ";
    cout << endl;

    return 0;
}

在这里插入图片描述

结语

vector相比string来说接口少了很多,也有很多逻辑相同之处,所以有些内容就没有细讲。使用oj刷题时,常常会用到vector,所以熟练掌握vector接口是非常必要。更详细的内容大家也可以参考STL文档,后期还有一些比较重要的非成员函数重载,都会纳入我们的讲解范围。
本篇博客的内容到这里就结束了,博主后续还会继续分享STL相关的内容,感谢大家的支持!♥

相关文章
|
4月前
|
存储 编译器 C++
【C++】vector介绍+模拟实现
【C++】vector介绍+模拟实现
|
25天前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
50 4
|
6天前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
27 0
|
10天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
21 0
|
2月前
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
26 1
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
77 6
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
90 7
|
2月前
|
编译器 C++
【C++】—— vector模拟实现
【C++】—— vector模拟实现
|
2月前
|
编译器 C语言 C++
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
58 3
|
2月前
|
C++
【C++】C++ STL探索:Vector使用与背后底层逻辑(三)
【C++】C++ STL探索:Vector使用与背后底层逻辑