一、什么是vector
vector是表示可变大小的数组的序列容器,就像数组一样,vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效,但是它的大小是动态可变的,并且它的大小会被容器自动处理。
二、vector的构造
常用的构造函数:
构造函数声明 | 接口声明 |
vector() | 无参构造函数 |
vector(size_type n, const value_type& val=value_type()) | 构造并初始化n个val |
vector(const vector& x) | 拷贝构造函数 |
vector(InputIterator first,InputIterator last) | 使用迭代器进行初始化构造 |
笔者想要特别提一下这种构造方式:
vector(size_type n, const value_type& val=value_type())
这里如果没有显式提供要初始化实例,则会调用该类型的默认构造函数进行初始化,如果是整型则会默认初始化为0,如果是自定义类型:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class A
{
public:
int a;
int b;
int c;
A()
:a(1),b(2),c(3)
{}
};
int main()
{
A k;
k.a = 4;
k.b = 3;
vector<A> v1(1,k);
cout << v1[0].a << " " << v1[0].b << " " << v1[0].c << endl;
vector<A> v2(1);
cout << v2[0].a << " " << v2[0].b << " " << v2[0].c << endl;
return 0;
}
输出结果为:
可以看到,如果是自定义类型给出第二个参数会进行拷贝构造,不给则会进行默认构造。
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<int> v1;//无参构造
vector<int> v2(10, 1);//构造并初始化为1
vector<int> v3(10);//构造,不给参数会根据元素的类型进行默认初始化
vector<int> v4(v2);//拷贝构造
string s1("hello world");
vector<int> v5(s1.begin(), s1.end());//这样可行吗?里面存储的是什么?
}
三、vector的迭代器
iterator的使用 | 接口说明 |
begin+end | begin获取第一个数据的位置,end获取最后一个数据的下一个位置 |
rbegin+rend | rbegin获取最后一个数据的位置,rend获取第一个数据的前一个位置 |
函数原型:
iterator begin() noexcept;
const_iterator begin() const noexcept;
iterator end() noexcept;
const_iterator end() const noexcept;
reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;
reverse_iterator rend() noexcept;
const_reverse_iterator rend() const noexcept;
迭代器的使用:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
int k = 0;
vector<int> v1(10);
for (auto& i : v1)
{
i += k;
++k;
}
vector<int>::iterator it = v1.begin();
//auto it = v1.begin()也可以写成这样
while (it != v1.end())
{
cout << *it << " ";
++it;
}
cout << endl;
vector<int>::reverse_iterator it2 = v1.rbegin();
while (it2 != v1.rend())
{
cout << *it2 << " ";
++it2;
}
}
输出结果为:
四、vecotr的容量
容量空间 | 接口说明 |
size | 获取已存在的数据的个数 |
capacity | 获取最多能容纳的数据的个数 |
empty | 判断容器是否为空 |
resize | 改变vector的size |
reserve | 改变capacity或者预留空间 |
函数原型:
size_type size() const noexcept;
size_type capacity() const noexcept;
bool empty() const noexcept;
void resize (size_type n);
void resize (size_type n, const value_type& val);
void reserve (size_type n);
容量相关的函数使用:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<int> v1(10,1);
cout << "初始:" <<endl;
cout << "v1.size():" << v1.size() << endl;
cout << "v1.capacity():" << v1.capacity() << endl;
v1.reserve(20);
cout << "扩容:" << endl;
cout << "v1.size():" << v1.size() << endl;
cout << "v1.capacity():" << v1.capacity() << endl;
v1.reserve(5);
cout << "reverse减少空间:" << endl;
cout << "v1.size():" << v1.size() << endl;
cout << "v1.capacity():" << v1.capacity() << endl;
v1.resize(5);
cout << "resize减少空间:" << endl;
cout << "v1.size():" << v1.size() << endl;
cout << "v1.capacity():" << v1.capacity() << endl;
}
输出结果:
可以发现,reverse函数只能扩容,不能进行容量缩减,resize函数可以减少size但是不能改变分配的内存空间的大小。
五、vector的增删查改
crud函数 | 接口说明 |
push_back | 在尾部插入一个数据 |
pop_back | 删除尾部的一个数据 |
find | 查找一个函数第一次出现的下标,但是不是vector的成员 |
insert | 在给定的pos前插入一个元素 |
erase | 删除给定的pos位置的元素 |
swap | 交换两个vector的数据空间 |
operator[] | 能够像数组一样访问vector |
函数原型:
void push_back (const value_type& val);
void pop_back();
template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value);
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 erase (const_iterator position);//擦除对应位置的一个
iterator erase (const_iterator first, const_iterator last);//擦除迭代器对应的一段
void swap (vector& x);
reference operator[] (size_type n);
const_reference operator[] (size_type n) const;
函数的使用:
push_back函数与pop函数:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<int> v(10);
v.push_back(10);
cout << "插入后:";
for (auto i : v)
{
cout << i << " ";
}
v.pop_back();
v.pop_back();
cout << endl;
cout << "删除后:";
for (auto i : v)
{
cout << i << " ";
}
return 0;
}
输出结果:
find函数:
find函数实际上是算法标准库中的一个函数,不是任何一个容器的成员函数。它返回一个迭代器,如果找到则返回对应元素的一个迭代器,否则返回传入的第二个参数,可以配合insert函数和erase函数使用。
template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value);
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<int> v = { 1,2,3,4,5,6,3,8,9 };
auto it = find(v.begin(), v.end(), 3);
if (it != v.end())
cout << "发现" << *it << "在位置:" << it - v.begin();
else
cout << "没有发现";
return 0;
}
输出结果为:
insert函数:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
int k = 0;
vector<int> v(10);
for (auto& i : v)
{
i = k;
++k;
}
vector<int> v1(10,1);
vector<int> v2(10, 1);
vector<int> v3(10, 1);
v1.insert(v1.begin() + 2, 10);//只增加一个数据
v2.insert(v2.begin()+2, 2,10);//增加自定义个数据
v3.insert(v3.begin() + 2, v.begin() + 1, v.begin() + 7);//使用迭代器进行插入
cout << "v1:";
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;
cout << "v2:";
for (auto i : v2)
{
cout << i << " ";
}
cout << endl;
cout << "v3:";
for (auto i : v3)
{
cout << i << " ";
}
return 0;
}
输出结果为:
erase函数:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<int> v1 = { 1,2,3,4,5,6,7,8,9 };
vector<int> v2 = { 1,2,3,4,5,6,7,8,9 };
v1.erase(v1.begin() + 2);
cout << "v1删除后:";
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;
v2.erase(v2.begin() + 2, v2.begin() + 5);
cout << "v2删除后:";
for (auto i : v2)
{
cout << i << " ";
}
return 0;
}
输出结果为:
swap函数:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<int> v1 = { 1,2,3,4,5 };
vector<int> v2 = { 5,6,7,8,9 };
v1.swap(v2);
cout << "v1:";
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;
cout << "v2:";
for (auto i : v2)
{
cout << i << " ";
}
return 0;
}
输出结果:
operator[]:
可以通过[]像数组那样访问vector:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<int> v1 = { 1,2,3,4,5,6,7,8,9};
for (int i = 0; i < v1.size(); ++i)
cout << v1[i] << " ";
return 0;
}
输出结果为: