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

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