目录
编辑
一、vector的基本介绍
二、vector的使用
1.构造函数的介绍
2.容量操作
size和capacity
reserve和resize
empty
3.vector的遍历
operator[ ](size_t n)
迭代器使用
begin和end
rbegin和rend
4.vector的增删查改
push_back和pop_back
insert和erase
find函数(不是vector成员函数)
swap
一、vector的基本介绍
1、vector是表示可变大小数组的序列容器。
2、vector就像数组一样,也采用的连续空间来存储元素,这也意味着可以采用下标对vector的元素进行访问。
3、vector与普通数组不同的是,vector的大小是可以动态改变的。
4、当vector需要重新分配大小时,其做法是,分配一个新的数组,然后将全部元素移到这个数组当中,并释放原来的数组空间。
5、vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因此存储空间比实际需要的存储空间一般更大。不同的库采用不同的策略权衡空间的使用和重新分配,以至于在末尾插入一个元素的时候是在常数的时间复杂度完成的。
6、由于vector采用连续的空间来存储元素,与其他动态序列容器相比,vector在访问元素的时候更加高效,在其末尾添加和删除元素相对高效,而对于不在其末尾进行的删除和插入操作效率则相对较低。
二、vector的使用
1.构造函数的介绍
1.1 empty container constructor (default constructor)
构造一个没有元素的空容器。
explicit vector (const allocator_type& alloc = allocator_type());
示例:构造一个某类型的空容器。
vector<int> v1; //构造int类型的空容器
fill constructor
构造一个包含 n 个元素的容器。每个元素都是 val 的副本(如果提供)。
explicit vector (size_type n);vector (size_type n, const value_type& val,const allocator_type& alloc = allocator_type());
示例:构造一个含有n个val的某类型容器。
vector<int> v2(10, 2); //构造含有10个2的int类型容器
range constructor
构造一个容器,其中包含与范围 [first,last] 一样多的元素,每个元素都按相同的顺序从该
范围内的对应元素 emplace 构造。
template <class InputIterator>vector (InputIterator first, InputIterator last,const allocator_type& alloc = allocator_type());
示例:使用迭代器拷贝构造某一段内容。.
vector<int> v4(v2.begin(), v2.end()); //使用迭代器拷贝构造v2容器的某一段内容
copy constructor (and copying with allocator)
以相同的顺序构造一个容器,其中包含 x 中每个元素的副本。
vector (const vector& x);
vector (const vector& x, const allocator_type& alloc);
示例:拷贝构造某类型容器的复制品。
vector<int> v3(v2); //拷贝构造int类型的v2容器的复制品
move constructor (and moving with allocator)
构造一个获取 x 元素的容器。
如果指定了 alloc 并且与 x 的分配器不同,则移动元素。否则,不会构造任何元素(其所有权直接转移)。
x 处于未指定但有效的状态。
vector (vector&& x);
vector (vector&& x, const allocator_type& alloc);
这里涉及到右值引用,进阶阶段会讲解。目前能看得懂就行
initializer list constructor(C++11)
按相同的顺序构造一个容器,其中包含 il 中每个元素的副本。
vector (initializer_list<value_type> il,const allocator_type& alloc = allocator_type());
示例: 使用初始化列表和默认分配器创建vector对象
std::vector<int> v1 = {1, 2, 3};
2.容量操作
size和capacity
通过size函数获取当前容器中的有效元素个数,通过capacity函数获取当前容器的最大容量。
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);cout << v.size() << endl; //获取当前容器中的有效元素个数cout << v.capacity() << endl; //获取当前容器的最大容量return 0;
}
reserve和resize
通过reserse函数改变容器的最大容量,resize函数改变容器中的有效元素个数。
reserve规则:
1、当所给值大于容器当前的capacity时,将capacity扩大到该值。
2、当所给值小于容器当前的capacity时,什么也不做。
resize规则:
1、当所给值大于容器当前的size时,将size扩大到该值,扩大的元素为第二个所给值,若未 给出,则默认为0。
2、当所给值小于容器当前的size时,将size缩小到该值。
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);cout << v.size() << endl; //10cout << v.capacity() << endl; //10v.reserve(20); //改变容器的capacity为20,size不变cout << v.size() << endl; //10cout << v.capacity() << endl; //20v.resize(15); //改变容器的size为15cout << v.size() << endl; //15cout << v.capacity() << endl; //20return 0;
}
empty
通过empty函数判断当前容器是否为空。
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);cout << v.empty() << endl;return 0;
}
3.vector的遍历
operator[ ](size_t n)
获取下标为n的元素。
int main()
{vector <int> v1(10, 1);for (size_t i = 0; i < v1.size(); i++){cout << v1[i] << " ";//重载[]遍历数组}cout << endl;return 0;
}
vector是支持迭代器的,所以我们还可以用范围for对vector容器进行遍历。(支持迭代器就支持范围for,因为在编译时编译器会自动将范围for替换为迭代器的形式)
迭代器使用
begin和end
通过begin函数可以得到容器中第一个元素的正向迭代器,通过end函数可以得到容器中最后一个元素的后一个位置的正向迭代器。
正向迭代器遍历容器:
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);//正向迭代器遍历容器vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";it++;}cout << endl;return 0;
}
rbegin和rend
通过rbegin函数可以得到容器中最后一个元素的反向迭代器,通过rend函数可以得到容器中第一个元素的前一个位置的反向迭代器。
反向迭代器遍历容器:
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);//反向迭代器遍历容器vector<int>::reverse_iterator rit = v.rbegin();while (rit != v.rend()){cout << *rit << " ";rit++;}cout << endl;return 0;
}
4.vector的增删查改
push_back和pop_back
通过push_back函数对容器进行尾插,pop_back函数对容器进行尾删。
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v;v.push_back(1); //尾插元素1v.push_back(2); //尾插元素2v.push_back(3); //尾插元素3v.push_back(4); //尾插元素4v.pop_back(); //尾删元素v.pop_back(); //尾删元素v.pop_back(); //尾删元素v.pop_back(); //尾删元素return 0;
}
insert和erase
通过insert函数可以在所给迭代器位置插入一个或多个元素,通过erase函数可以删除所给迭代器位置的元素,或删除所给迭代器区间内的所有元素(左闭右开)。
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.insert(v.begin(), 0); //在容器开头插入0v.insert(v.begin(), 5, -1); //在容器开头插入5个-1v.erase(v.begin()); //删除容器中的第一个元素v.erase(v.begin(), v.begin() + 5); //删除在该迭代器区间内的元素(左闭右开)return 0;
}
以上是按位置进行插入或删除元素的方式,若要按值进行插入或删除(在某一特定值位置进行插入或删除),则需要用到find函数。
find函数(不是vector成员函数)
find函数共三个参数,前两个参数确定一个迭代器区间(左闭右开),第三个参数确定所要寻找的值。
find函数在所给迭代器区间寻找第一个匹配的元素,并返回它的迭代器,若未找到,则返回所给的第二个参数。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);vector<int>::iterator pos = find(v.begin(), v.end(), 2); //获取值为2的元素的迭代器v.insert(pos, 10); //在2的位置插入10pos = find(v.begin(), v.end(), 3); //获取值为3的元素的迭代器v.erase(pos); //删除3return 0;
}
注意: find函数是在算法模块(algorithm)当中实现的,不是vector的成员函数。
swap
通过swap函数可以交换两个容器的数据空间,实现两个容器的交换。
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v1(10, 1);vector<int> v2(10, 2);v1.swap(v2); //交换v1,v2的数据空间return 0;
}
本篇博客到此结束,欢迎评论区留言~