【C++学习笔记】:vector容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: vector容器对元素使用连续的存储位置,使用变量名加索引值来访问其元素,这看起来和数组差不多。那vector容器和数组的区别在哪?区别在于,vector容器的大小是动态变...

1、写在前面

大家好,今天文章的内容是:

  • vector容器

2、内容

2.1、介绍

vector(向量)是一个序列容器,表示可以改变大小的数组。

vector容器对元素使用连续的存储位置,使用变量名加索引值来访问其元素,这看起来和数组差不多。

vector容器和数组的区别在哪?

区别在于,vector容器的大小是动态变化的,其存储是由vector容器自动处理。与数组相比,vector容器会消耗更多的内存,用于换取以高效方式管理存储和动态增长的能力

简单的说,vector容器来内部使用用动态分配的数组来存储其元素。如果容器插入新元素后容量不够,则需要重新分配此数组,以增加其大小(也就是分配一个新数组并将所有的元素移动过去),为了提高效率,vector容器会分配额外的存储空间,实际容量可能大于数组大小,以适应可能的存储空间变化。

2.2、使用

导入头文件

vector容器以类模板vector<T>的形式定义在<vector>头文件中,并位于std命名空间中。

因此我们在创建vector容器之前需要导入以下代码:

#include <vector>
using namespace std;

在导入头文件后,就可以使用vector容器了。

创建容器

创建vector容器一般有五种方法:

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

int main() {
    vector<int> first;            // 创建一个空的vector容器
    vector<int> second(10);        // 有10个元素,默认初始值为0
    vector<int> third(10,5);        // 有10个元素,指定初始值为5
    vector<int> fourth{1, 3, 5, 7};     // 创建并指定初始值
    vector<int> fifth(fourth);         // 通过其他存储类型相同的容器存来创建新的vector容器
    return 0; 
}

上述vector容器创建后,元素内容如下:

first: []
second: [0,0,0,0,0,0,0,0,0,0]
third: [5,5,5,5,5,5,5,5,5,5]
fourth: [1,3,5,7]
fifth: [1,3,5,7]

成员函数

vector容器的成员函数有很多,现简单记录如下:


push_back()

void push_back (const value_type& val);    // C++98 / C++11
void push_back (value_type&& val);         // C++11

该函数用于在当前vector容器末尾元素的后面添加一个新的元素,此时vector容器的大小将加一。注意,这有可能导致自动重新分配存储空间。

举个例子:

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

int main() {
    vector<int> val;     // []
    val.push_back(8);    // [8]
    val.push_back(16);    // [8,16]
    val.push_back(4);    // [8,16,4]
    val.push_back(73);    // [8,16,4,73]
    return 0; 
}

clear()

void clear();           // C++98
void clear() noexcept;  // C++11

该函数用于销毁vector容器中的所有元素,这时容器的大小变为0。


empty()

bool empty() const;           // C++98
bool empty() const noexcept;  // C++11

empty()函数用于判断容器是否为空,是就返回true,否则返回false


pop_back()

void pop_back();

该函数用于弹出(删除)中当前vector容器的最后一个元素,此时容器大小将减一。

举个例子:

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

// 备注:
// back()函数,用于返回容器最后一个元素的引用

int main( ) {
    vector<int> ans;    // []
    ans.push_back(10);    // [10]
    ans.push_back(20);    // [10,20]
    ans.push_back(30);    // [10,20,30]
    int sum = 0;
    // 当容器为空时退出循环 
    while (!ans.empty()) {
        sum += ans.back();    // 添加当前容器的最后一个元素到sum中 
        ans.pop_back();        // 弹出末尾元素 
    }
    cout << "ans中的元素之和为:" << sum << '\n';
    return 0;
}

运行结果:

ans中的元素之和为:60 

size()

size_type size() const;          // C++98
size_type size() const noexcept; // C++11

该函数用于返回容器中的元素个数。

注意,这里指的元素个数不等同于vector容器的容量。

举个例子:

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

int main( ) {
    vector<int> value {1,3,5,7}; // [1,3,5,7]
    value.push_back(9);         // [1,3,5,7,9]
    int size = value.size();     // size为容器元素个数
    cout << "value中的元素为:";
    for(int i = 0; i<size; i++) {
        cout << value[i] << " ";
    }
    return 0;
}

运行结果:

value中的元素为:1 3 5 7 9

insert()

  • C++98
// 方式一:插入单个元素
iterator insert (iterator position, const value_type& val);
// 方式二:填充容器
void insert (iterator position, size_type n, const value_type& val);
// 方式三:插入指定范围内的元素
template <class InputIterator> void insert (iterator position, InputIterator first, InputIterator last);
  • C++11
// 方式一:插入单个元素
iterator insert (const_iterator position, const value_type& val);
// 方式二:填充容器
iterator insert (const_iterator position, size_type n, const value_type& val);
// 方式三:插入指定范围内的元素
template <class InputIterator>iterator insert (const_iterator position, InputIterator first, InputIterator last);
// 方式四:右值引用
iterator insert (const_iterator position, value_type&& val);
// 方式五:利用初始化列表插入
iterator insert (const_iterator position, initializer_list<value_type> il);

该函数用于在指定的位置插入一个或多个元素。

  • 例一
#include <iostream>
#include <vector>
using namespace std;

int main () {
    vector<int> myVector (3,111);
    cout << "插入前,容器中的元素为;";
    for (int i = 0; i < myVector.size(); i++) {
        cout << ' ' << myVector[i];
    }
    cout << endl;
    // 指向vector中第一个元素的迭代器对象;
    vector<int>::iterator it = myVector.begin(); 
    // 插入元素 
    it = myVector.insert(it, 200);
    cout << "插入后,容器中的元素为;";
    for (int i = 0; i < myVector.size(); i++) {
        cout << ' ' << myVector[i];
    }
    cout << endl;
    return 0;
}

运行结果:

插入前,容器中的元素为; 111 111 111
插入后,容器中的元素为; 200 111 111 111
  • 例二:
#include <iostream>
#include <vector>
using namespace std;

int main () {
    vector<int> myVector (3,111);
    cout << "插入前,容器中的元素为;";
    for (int i = 0; i < myVector.size(); i++) {
        cout << ' ' << myVector[i];
    }
    cout << endl;
    // 指向vector中第一个元素的迭代器;
    vector<int>::iterator it = myVector.begin(); 
    // 插入元素 
    myVector.insert(it, 3, 333);
    cout << "插入后,容器中的元素为;";
    for (int i = 0; i < myVector.size(); i++) {
        cout << ' ' << myVector[i];
    }
    cout << endl;
    return 0;
}

运行结果:

插入前,容器中的元素为; 111 111 111
插入后,容器中的元素为; 333 333 333 111 111 111
  • 例三:
#include <iostream>
#include <vector>
using namespace std;

int main () {
    vector<int> myVector (3,111);
    cout << "插入前,容器中的元素为;";
    for (int i = 0; i < myVector.size(); i++) {
        cout << ' ' << myVector[i];
    }
    cout << endl;
    // 指向vector中第一个元素的迭代器;
    vector<int>::iterator it = myVector.begin();
    // 新容器:[444, 444] 
    vector<int> newVector (2,444);
    // 将新容器中指定的元素插入旧容器中 
    myVector.insert(it+1, newVector.begin(), newVector.end());
    cout << "插入后,容器中的元素为;";
    for (int i = 0; i < myVector.size(); i++) {
        cout << ' ' << myVector[i];
    }
    cout << endl;
    return 0;
}

运行结果:

插入前,容器中的元素为; 111 111 111
插入后,容器中的元素为; 111 444 444 111 111
  • 例四:
#include <iostream>
#include <vector>
using namespace std;

int main () {
    vector<int> myVector (3,111);
    cout << "插入前,容器中的元素为;";
    for (int i = 0; i < myVector.size(); i++) {
        cout << ' ' << myVector[i];
    }
    cout << endl;
    // 定义一个数组
    int myArray [] = {555, 555, 555};
    // 将数组中指定的元素插入旧容器中 
    myVector.insert (myVector.begin(), myArray, myArray+3);
    cout << "插入后,容器中的元素为;";
    for (int i = 0; i < myVector.size(); i++) {
        cout << ' ' << myVector[i];
    }
    cout << endl;
    return 0;
}

运行结果:

插入前,容器中的元素为; 111 111 111
插入后,容器中的元素为; 555 555 555 111 111 111

erase()

  • C++98
iterator erase (iterator position);
iterator erase (iterator first, iterator last);
  • C++11
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

该函数用于删除容器中的单个元素或者一组元素。

备注,在指定删除范围时,区间是左闭右开:$[first,last)$

  • 例一:
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> myVector;
    for(int i = 1; i<=10; i++) {
        myVector.push_back(i);
    }
    // 遍历并输出元素
    cout << "删除前,容器中的元素为:"; 
    for(int i = 0; i<myVector.size(); i++) {
        cout << " " << myVector[i];
    }
    cout << '\n';
    // 删除单个元素:myVector.begin()指向了第一个元素,加5后就是指向第六个元素
    myVector.erase (myVector.begin()+5);
    // 遍历并输出元素
    cout << "删除后,容器中的元素为:";
    for(int i = 0; i<myVector.size(); i++) {
        cout << " " << myVector[i];
    }
    cout << '\n';
    return 0;
}

运行结果:

删除前,容器中的元素为: 1 2 3 4 5 6 7 8 9 10
删除后,容器中的元素为: 1 2 3 4 5 7 8 9 10
  • 例二:
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> myVector;
    for(int i = 1; i<=10; i++) {
        myVector.push_back(i);
    }
    // 遍历并输出元素
    cout << "删除前,容器中的元素为:"; 
    for(int i = 0; i<myVector.size(); i++) {
        cout << " " << myVector[i];
    }
    cout << '\n';
    // 删除指定区间 [0, 4) 中的元素,效果等同于删除前三个元素 
    myVector.erase (myVector.begin(), myVector.begin()+3);
    // 遍历并输出元素
    cout << "删除后,容器中的元素为:";
    for(int i = 0; i<myVector.size(); i++) {
        cout << " " << myVector[i];
    }
    cout << '\n';
    return 0;
}

运行结果:

删除前,容器中的元素为: 1 2 3 4 5 6 7 8 9 10
删除后,容器中的元素为: 4 5 6 7 8 9 10

遍历容器

现在有一个vector容器val,内容为:[1,3,5,7,9]

代码如下:

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

int main() {

    // 创建空容器
    vector<int> val;     
    // 插入数据 
    val.push_back(1);
    val.push_back(3);
    val.push_back(5);
    val.push_back(7);
    val.push_back(9);
    
    return 0; 
}

现在给出三个遍历容器的例子。

  • 备注,遍历结果为:
1 3 5 7 9

举例一

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

举例二

for(vector<int>::iterator it = val.begin(); it != val.end(); ++it) {
    cout << *it << " ";
}

举例三

for(auto i = val.begin(); i < val.end(); i++) {
    cout << *i << " ";
}

3、写在最后

好的,今天就先记录到这里。

目录
相关文章
|
2天前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
25 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
2天前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
23 6
|
2天前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
18 7
|
2天前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
25 5
|
2天前
|
编译器 C语言 C++
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
18 3
|
2天前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
20 2
|
2天前
|
C++
【C++】C++ STL探索:Vector使用与背后底层逻辑(三)
【C++】C++ STL探索:Vector使用与背后底层逻辑
|
2天前
|
编译器 Linux C++
【C++】C++ STL探索:Vector使用与背后底层逻辑(二)
【C++】C++ STL探索:Vector使用与背后底层逻辑
|
2天前
|
编译器 C++ 容器
【C++】C++ STL探索:Vector使用与背后底层逻辑(一)
【C++】C++ STL探索:Vector使用与背后底层逻辑
|
17小时前
|
存储 缓存 C++
C++番外篇——list与vector的比较
C++番外篇——list与vector的比较
8 0