【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相关的内容,感谢大家的支持!♥

相关文章
|
5天前
|
存储 编译器 C++
【C++】vector介绍+模拟实现
【C++】vector介绍+模拟实现
|
6天前
|
算法 编译器 Linux
【C++】vector的模拟实现
【C++】vector的模拟实现
|
1月前
|
C++ 容器
C++中向量的操作vector
C++中向量的操作vector
|
6天前
|
存储 算法 C语言
【C++】vector的认识与使用
【C++】vector的认识与使用
|
11天前
|
存储 算法 C++
【C++】vector介绍以及模拟实现(超级详细)
【C++】vector介绍以及模拟实现(超级详细)
32 4
|
1月前
|
存储 C语言 C++
【C++】vector的使用上
**C++ STL的vector简介与用法:** Vector是动态顺序数组,提供高效下标访问,支持动态增长。与数组类似但可自动调整大小。常用构造函数包括默认、填充、迭代器范围和拷贝构造。析构函数自动释放内存。赋值运算符执行深拷贝。迭代器接口包括`begin()`和`end()`(反向对应`rbegin()`和`rend()`),C++11增加了const版本以支持只读访问。示例代码展示了不同构造函数和迭代器的使用。
|
2月前
|
C++ 容器
C++之评委打分案例(vector与deque容器练习)
C++之评委打分案例(vector与deque容器练习)
23 1
|
2月前
|
存储 算法 C++
C++一分钟之-容器概览:vector, list, deque
【6月更文挑战第21天】STL中的`vector`是动态数组,适合随机访问,但插入删除非末尾元素较慢;`list`是双向链表,插入删除快但随机访问效率低;`deque`结合两者优点,支持快速双端操作。选择容器要考虑操作频率、内存占用和性能需求。注意预分配容量以减少`vector`的内存重分配,使用迭代器而非索引操作`list`,并利用`deque`的两端优势。理解容器内部机制和应用场景是优化C++程序的关键。
37 5
|
2月前
|
存储 算法 C++
【C++/STL】:vector容器的基本使用
【C++/STL】:vector容器的基本使用
23 1
|
2月前
|
存储 安全 算法
C++的内置数组和STL array、STL vector
C++的内置数组和STL array、STL vector