文章目录
前言
本文主要介绍C++ STL常用容器之vector(顺序容器)的相关概念以及用法。
一、vector的介绍
std::vector是C++标准模板库(STL)中的一个序列容器,提供了动态数组的功能。它可以存储任意类型的元素,并支持动态调整大小。vector在内存中连续存储元素,允许高效的随机访问。
1.1 vector的优点
动态扩展: std::vector 可以根据需要动态地增长或缩小其大小。当添加新元素时,如果当前的容量不足以容纳新元素,vector会分配更多的内存空间。
高效访问: std::vector 中的元素在内存中连续存储,这意味着可以通过下标快速访问任意位置的元素。
自动管理内存: std::vector 会自动管理其内部的内存分配和释放,不需要程序员显式地调用new和delete。
1.2 vector的缺点
插入和删除效率: 在std::vector的开头或中间位置插入或删除元素时,可能需要移动大量元素以保持连续性,这会导致效率较低。相比之下,在尾部插入或删除元素(使用push_back和pop_back)则非常高效。
空间浪费: 由于std::vector在增长时通常会分配比当前所需更多的内存空间,因此在某些情况下可能会浪费一些内存。
1.3 使用场景
需要动态数组的场景: 当需要存储动态大小的数组时,可以使用std::vector来代替传统的C风格数组。
需要高效访问的场景: 由于std::vector中的元素连续存储,因此可以通过下标快速访问任意位置的元素。这使得vector在处理需要频繁访问元素的应用场景时非常高效。
需要自动内存管理的场景: 使用std::vector可以避免手动管理内存的复杂性,减少内存泄漏和野指针等问题的发生。这对于那些需要处理大量动态数据的场景来说非常有用。
对性能要求不苛刻的场景: 虽然std::vector在插入和删除元素时可能不是最高效的容器,但在大多数情况下,其性能已经足够满足需求。因此,在对性能要求不苛刻的场景下,使用vector是一个很好的选择。
二、vector常用的操作
2.1 创建、初始化以及遍历容器
#include <iostream>
#include <vector>
int main(int argc, char *argv[])
{
// 创建一个空的整型vector容器
std::vector<int> vec1;
// 使用初始值列表初始化vector容器
std::vector<int> vec2 = {1, 2, 3, 4, 5};
// 创建一个指定大小为10,初始值为1的vector容器
std::vector<int> vec3(10, 1);
// 使用迭代器遍历
std::cout << "vec1:" << std::endl;
for (std::vector<int>::iterator it = vec1.begin(); it != vec1.end(); it++) {
std::cout << *it << " ";
}
// 遍历 std::vector<int> 中的元素
std::cout << std::endl << "vec2:" << std::endl;
for (int elem : vec2) {
std::cout << elem << " ";
}
// 使用auto自动推导变量类型进行遍历
std::cout << std::endl << "vec3:" << std::endl;
for (auto& value : vec3) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
编译后输出如下
jeff@jeff:~/jeffPro/practice/grammar/c++$ g++ -o tmp tmp.cpp
jeff@jeff:~/jeffPro/practice/grammar/c++$ ./tmp
vec1:
vec2:
1 2 3 4 5
vec3:
1 1 1 1 1 1 1 1 1 1
jeff@jeff:~/jeffPro/practice/grammar/c++$
2.2 查询容器大小
#include <iostream>
#include <vector>
int main(int argc, char *argv[])
{
// 创建一个空的整型vector容器
std::vector<int> vec1;
// 使用初始值列表初始化vector容器
std::vector<int> vec2 = {1, 2, 3, 4, 5};
// 检查vector是否为空
bool isEmpty = vec1.empty();
if (isEmpty)
std::cout << "vec1 is Empty !" << std::endl;
else
std::cout << "vec1 is not Empty !" << std::endl;
// 获取vector的大小
int size = vec2.size();
std::cout << "vec2 size is " << size << std::endl;
return 0;
}
编译后输出如下
jeff@jeff:~/jeffPro/practice/grammar/c++$ g++ -o tmp tmp.cpp
jeff@jeff:~/jeffPro/practice/grammar/c++$ ./tmp
vec1 is Empty !
vec2 size is 5
jeff@jeff:~/jeffPro/practice/grammar/c++$
2.3 访问容器中的元素
#include <iostream>
#include <vector>
int main(int argc, char *argv[])
{
// 使用初始值列表初始化vector容器
std::vector<int> vec2 = {1, 2, 3, 4, 5};
// 访问第一个元素
int firstElement = vec2[0];
std::cout << "firstElement: " << firstElement << std::endl;
// 访问第二个元素
int secondElement = vec2.at(1);
std::cout << "secondElement: " << secondElement << std::endl;
return 0;
}
编译后输出如下
jeff@jeff:~/jeffPro/practice/grammar/c++$ g++ -o tmp tmp.cpp
jeff@jeff:~/jeffPro/practice/grammar/c++$ ./tmp
firstElement: 1
secondElement: 2
jeff@jeff:~/jeffPro/practice/grammar/c++$
2.4 往容器中添加元素
#include <iostream>
#include <vector>
int main(int argc, char *argv[])
{
// 使用初始值列表初始化vector容器
std::vector<int> vec2 = {1, 2, 3, 4, 5};
std::cout << "vec2:" << std::endl;
for (auto& value : vec2) {
std::cout << value << " ";
}
// 在vector末尾添加元素10
vec2.push_back(10);
std::cout << std::endl << "after push back,vec2:" << std::endl;
for (auto& value : vec2) {
std::cout << value << " ";
}
// 在vector开始位置插入元素0
vec2.insert(vec2.begin(), 0);
std::cout << std::endl << "after insert,vec2:" << std::endl;
for (auto& value : vec2) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
编译后输出如下
jeff@jeff:~/jeffPro/practice/grammar/c++$ g++ -o tmp tmp.cpp
jeff@jeff:~/jeffPro/practice/grammar/c++$ ./tmp
vec2:
1 2 3 4 5
after push back,vec2:
1 2 3 4 5 10
after insert,vec2:
0 1 2 3 4 5 10
jeff@jeff:~/jeffPro/practice/grammar/c++$
2.5 删除容器中的元素
#include <iostream>
#include <vector>
int main(int argc, char *argv[])
{
// 使用初始值列表初始化vector容器
std::vector<int> vec2 = {1, 2, 3, 4, 5};
std::cout << "vec2:" << std::endl;
for (auto& value : vec2) {
std::cout << value << " ";
}
// 删除vector最后一个元素
vec2.pop_back();
std::cout << std::endl << "after pop back,vec2:" << std::endl;
for (auto& value : vec2) {
std::cout << value << " ";
}
// 删除vector第一个元素
vec2.erase(vec2.begin());
std::cout << std::endl << "after erase,vec2:" << std::endl;
for (auto& value : vec2) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
编译后输出如下
jeff@jeff:~/jeffPro/practice/grammar/c++$ g++ -o tmp tmp.cpp
jeff@jeff:~/jeffPro/practice/grammar/c++$ ./tmp
vec2:
1 2 3 4 5
after pop back,vec2:
1 2 3 4
after erase,vec2:
2 3 4
jeff@jeff:~/jeffPro/practice/grammar/c++$
2.6 清空容器中的元素
// 清空容器中的所有元素
vec2.clear();
std::cout << std::endl << "after clear,vec2:" << std::endl;
for (auto& value : vec2) {
std::cout << value << " ";
}
总结
std::vector 是C++ STL中非常重要且常用的容器类,提供了灵活的动态数组功能。通过上述示例代码,可以掌握vector的基本用法和操作方法。在实际编程中,可以根据具体需求选择合适的操作来管理和处理数据。