本文写一写 vector 冷门但是可能有用的功能。
# vector 的构造函数
cppreference (opens new window)
vector
有一堆构造函数。C++ 98 有如下:
vector (const allocator_type& alloc = allocator_type()); // default (1)
vector (size_type n,
const value_type& val = value_type(),
const allocator_type& alloc = allocator_type()); // fill (2)
template <class InputIterator>
vector (InputIterator first,
InputIterator last,
const allocator_type& alloc = allocator_type()); // range (3)
vector (const vector& x); // copy (4)
- default:
vector<int> v;
构造一个空的vector<int>
; - fill:
vector<int> v(3, 1);
构造一个vector<int>
装有 3 个1
; - range:
vector<int> v(s.begin(), s.end())
对 s 进行遍历,并构造一个相同的vector<int>
; - copy:从一个
vector
拷贝构造另一个。
值得一提的是第三个 range
,它能将 set
list
等数据结构转化为 vector
。更有意思的是,set
等模板类也有类似的构造函数,因此二者可以互相转换:
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<int> v1 = { 1, 4, 2, 3 };
set<int> s1(v1.begin(), v1.end()); // s1 = {1, 2, 3, 4}
vector<int> v2(s1.begin(), s1.end()); // v2 = {1, 2, 3, 4}
return 0;
}
# 有序 vector 的集合运算
见 set-集合运算。
# swap
vector 有一个成员函数叫 swap
。这个 swap
是做什么的?
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<int> v1 = {1, 2, 3}, v2 = {4, 5};
v1.swap(v2); // 执行结束后,v1 = {4, 5}, v2 = {1, 2, 3}
}
在 cppreference (opens new window) 上提到,该函数可以和另一个 vector 进行交换,时间复杂度为 。貌似只是换一下指向数组的位置,但是可以用于滚动数组,不用再 %2
和 (cur+1)%2
啦。