简介
最近学写了C++简单记录一下。
C++在C的基础上引入了模板这一概念,而STL库则为我们提供了许多模板。
vector
容器是 STL 中最常用的容器之一,它和 array 容器非常类似,都可以看做是对 C++ 普通数组的“升级版”。不同之处在于,array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。
vector
常被称为向量容器,因为该容器擅长在尾部插入或删除元素,在常量时间内就可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素,则花费时间要长一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)。
vector的使用
vector 容器以类模板 vector( T 表示存储元素的类型)的形式定义在 头文件中,并位于 std 命名空间中。因此,在创建该容器之前,代码中需包含如下内容:
#include <vector>
using namespace std;
初始化vector
在加入了上面的库和命名空间后,就可以创建vector了。
比如我们创建一个存储元素为int型的vertor:
vector<int> testVector;
由于vector是动态分布空间的,而此时vector中没有元素,所以此时没有给其分配空间,当添加元素时就会自动分配。
我们也可以给vector添加空间:
int main (){
vector<int> testVector;
//调用成员函数
testVector.reserve(10);
cout << &testVector;
return 0;
}
reserve()的意思就是给容器分配了十个单位的空间。
注意,如果 vector 的容量在执行此语句之前,已经大于或等于 10 个元素,那么这条语句什么也不做;另外,调用 reserve() 不会影响已存储的元素,也不会生成任何元素,即 values 容器内此时仍然没有任何元素。
我们不仅可以创建空的容器,也可以像创建数组一样,创建有元素的容器:vector<int> primes {2, 3, 5, 7, 11, 13, 17, 19};
也可以创建制定空间的容器:vector<double> test(20);
如此,该容器开始时就有 20 个元素,它们的默认初始值都为 0,如果不想用 0 作为默认值,也可以指定一个其它值,例如:
vector<double> test(20, 1.0);
括号中的参数也可以是一个变量。
也可以利用同类型的容器创建新的容器:
vector<char>value1(5, 'c');
vector<char>value2(value1);
由此,value2 容器中也具有 5 个字符 ‘c’。在此基础上,如果不想复制其它容器中所有的元素,可以用一对指针或者迭代器来指定初始值的范围,例如:int array[]={1,2,3}; vector<int>values(array, array+2);//values 将保存{1,2}
vector的成员函数
容器好用的一个原因就是库提供了大量的成员函数方便我们使用。
下面是简单的使用:
//
// main.cpp
// Hello C++
//
// Created by 差不多先生 on 2022/3/8.
//
// c++向量
#include <iostream>
#include <vector>
using namespace std;
int main() {
//初始化一个空vector容量
vector<char>value;
//向value容器中的尾部依次添加 3、G、N 字符
value.push_back('3');
value.push_back('G');
value.push_back('N');
//调用 size() 成员函数容器中的元素个数
printf("元素个数为:%d\n", value.size());
//使用迭代器遍历容器
for (auto i = value.begin(); i < value.end(); i++) {
cout << *i << " ";
}
cout << endl;
//向容器末尾插入字符
value.insert(value.end(), 'B');
cout << "末尾元素为:" << value.at(3) << endl;
for (auto i = value.begin(); i < value.end(); i++) {
cout << *i << " ";
}
return 0;
}