【C++STL基础入门】vector向量基础使用

简介: 【C++STL基础入门】vector向量基础使用

前言


C++STL(Standard Template Library)是C++标准库中的一部分,提供了一组通用的模板容器和算法,以及一些有用的功能。其中,vector是STL中最重要且常用的容器之一。它类似于数组,但提供了更多的功能和灵活性。本文将详细介绍vector的基本使用方法,帮助读者快速入门。

018db374cd5f4019915e7a76e99abcd5.png


一、头文件


当我们使用vector向量的时候,需要加上:

#include <vector>
using namespace std;


头文件,第二行可写可不写,当不写时,需要加上std::前缀


二、定义vector向量


1、vector<int> vec;

这行代码的含义是在C++中定义了一个名为vec的变量,它的类型是vector,也就是一个整数向量。


vector:这是一个模板类,用来表示存储整数的向量。它提供了一系列的操作函数,方便我们对向量进行添加、删除、查找等操作。

vec:这是我们给这个变量取的一个名字,你可以根据实际情况自定义变量名。

这样写的原因是,我们可能需要在程序中存储一组整数,并对其进行各种操作,比如添加、删除、查找等。使用vector可以方便地管理这些整数,而具体的变量名vec是为了让我们能够通过这个名字引用到这个向量。通过这样的定义,我们可以使用vec来表示整数向量,并使用向量的成员函数来实现相关的操作,提高代码的可读性和易于维护性。


三、构造函数


1、vector();

功能:这是一个无参构造函数,用于创建一个空的向量。

参数:没有参数,因为它是无参构造函数。

示例代码:

#include <vector>
#include <iostream>
int main() {
    std::vector<int> vec; // Create an empty vector
    std::cout << "Size of vec: " << vec.size() << std::endl; // Output: 0
    return 0;
}


输出:

bd381a70acb54ea38ae01c6a34b6948a.png

2、vector(size_type _Count);

功能:这个构造函数用于创建一个包含指定数量元素的向量,所有元素的值为默认值。

参数:

_Count:表示向量中包含的元素数量。

示例代码:

#include <vector>
#include <iostream>
int main() {
    std::vector<int> vec(5); // Create a vector with 5 elements, all initialized to 0
    std::cout << "Size of vec: " << vec.size() << std::endl; // Output: 5
    std::cout << "Elements of vec: ";
    for (const auto& element : vec) {
        std::cout << element << " "; // Output: 0 0 0 0 0
    }
    return 0;
}


输出:

0765598ecbb94d61af5acc8f5f66a2f2.png

3、vector( size_type num, const TYPE &val );

功能:这个构造函数用于创建一个包含指定数量元素的向量,所有元素的值都为给定的val值。

参数:

num:表示向量中包含的元素数量。

val:表示向量中所有元素的初始值。

示例代码:

#include <vector>
#include <iostream>
int main() {
    std::vector<int> vec(4, 10); // Create a vector with 4 elements, all initialized to 10
    std::cout << "Size of vec: " << vec.size() << std::endl; // Output: 4
    std::cout << "Elements of vec: ";
    for (const auto& element : vec) {
        std::cout << element << " "; // Output: 10 10 10 10
    }
    return 0;
}


输出:

ef96d2a8958e4458b0d715b19bbd9f6e.png

4、vector( const vector &from );

功能:这个构造函数用于创建一个与另一个向量from相同的向量。

参数:

from:表示另一个向量,用于创建新向量的初始值。

示例代码:

#include <vector>
#include <iostream>
int main() {
    std::vector<int> fromVec = {1, 2, 3, 4, 5};
    std::vector<int> vec(fromVec); // Create a new vector by copying fromVec
    std::cout << "Size of vec: " << vec.size() << std::endl; // Output: 5
    std::cout << "Elements of vec: ";
    for (const auto& element : vec) {
        std::cout << element << " "; // Output: 1 2 3 4 5
    }
    return 0;
}


输出:

ea316295301647d29a5dacef7425dc7e.png

这些函数都是向量类的构造函数,用于创建不同初始条件的向量对象。通过不同的参数组合,我们可以创建具有不同元素数量和初始值的向量。这些构造函数提供了方便的方式来初始化向量对象,以便在程序中使用。使用构造函数可以避免手动逐个元素添加到向量中的麻烦,提高了代码的可读性和开发效率。


四、属性函数


1.容量

1、capacity();

功能:返回当前向量能够容纳的元素数量(即预分配的存储空间)。

参数:没有参数,因为它是一个成员函数。

返回值:一个整数,表示当前向量的容量。

示例代码:

#include <vector>
#include <iostream>
int main() {
    std::vector<int> vec;
    std::cout << "Capacity of vec: " << vec.capacity() << std::endl; // Output: 0
    vec.push_back(1);
    std::cout << "Capacity of vec: " << vec.capacity() << std::endl; // Output: 1
    vec.push_back(2);
    std::cout << "Capacity of vec: " << vec.capacity() << std::endl; // Output: 2
    return 0;
}


输出:

27a2ab3e2f1f4a499c0cd0fd466d58fe.png

2、reserve();

功能:增加向量的容量,以便至少能够存储指定数量的元素。

参数:

new_capacity:新的容量值,表示要预留的存储空间大小。

返回值:无。

示例代码:

#include <vector>
#include <iostream>
int main() {
    std::vector<int> vec;
    std::cout << "Capacity of vec before reserve: " << vec.capacity() << std::endl; // Output: 0
    vec.reserve(10);
    std::cout << "Capacity of vec after reserve: " << vec.capacity() << std::endl; // Output: 10
    return 0;
}


输出:

628e883fe022420dae407815cca22b05.png

2.大小

1、size()

功能:返回当前向量中元素的数量。

参数:没有参数,因为它是一个成员函数。

返回值:一个整数,表示当前向量中的元素数量。

示例代码:

#include <vector>
#include <iostream>
int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::cout << "Size of vec: " << vec.size() << std::endl; // Output: 5
    return 0;
}


输出:

204cbde44762464f85fa1ee3b9d5d830.png

2、resize()

功能:改变向量的大小,添加或删除元素以确保向量具有指定的数量。

参数:

new_size:新的向量大小,表示要调整的元素数量。

返回值:无。

示例代码:

#include <vector>
#include <iostream>
int main() {
    std::vector<int> vec = {1, 2, 3};
    std::cout << "Size of vec before resize: " << vec.size() << std::endl; // Output: 3
    vec.resize(5);
    std::cout << "Size of vec after resize: " << vec.size() << std::endl; // Output: 5
    return 0;
}


输出:

547403ee445049d09c307db069d4be76.png

3、empty()

功能:检查当前向量是否为空,即是否没有任何元素。

参数:没有参数,因为它是一个成员函数。

返回值:一个布尔值,如果向量为空则返回true,否则返回false。

示例代码:

#include <vector>
#include <iostream>
int main() {
    std::vector<int> vec;
    std::cout << "Is vec empty? " << (vec.empty() ? "Yes" : "No") << std::endl; // Output: Yes
    vec.push_back(1);
    std::cout << "Is vec empty? " << (vec.empty() ? "Yes" : "No") << std::endl; // Output: No
    return 0;
}


输出:

f612dcc981d4421d968489484a07c148.png


总结


本文介绍了C++STL中vector的基本使用方法。首先,我们需要包含相应的头文件并使用std命名空间。然后可以创建空的vector或带初始值的vector,也可以通过复制其他vector来创建新的vector。接下来,我们学习了如何访问和修改vector中的元素,使用下标操作符[]或成员函数at()可以完成这些操作。还学习了向vector中添加和删除元素的方法,包括push_back()、pop_back()、insert()和erase()。最后,我们了解了如何获取vector的大小和容量,使用size()和capacity()函数可以轻松实现。


希望通过阅读这篇文章,读者对vector的基础使用有了更深入的了解,并能够在实际编程中灵活运用。vector作为STL中的重要容器,可以帮助我们高效地管理和操作数据,提升程序的性能和可维护性。

相关文章
|
3月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
10月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
286 2
|
10月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
571 73
|
7月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
113 0
|
10月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
10月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
456 3
|
10月前
|
C++
|
11月前
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
694 1
|
11月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
9月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
378 12