本文写一写 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 进行交换,时间复杂度为 O(1)O(1)。貌似只是换一下指向数组的位置,但是可以用于滚动数组,不用再 %2(cur+1)%2 啦。