纵然STL
里的许多实现在有些时候充满了玄学气息
,但有些时候STL
还是能大大缩短编码
的时间,这里不涉及内部实现原理
vector
C++ reference : 详细参考信息
头文件
#include<vector>
构造器 && 初始化
- 默认构造器:empty container constructor
- 批量构造器:fill constructor
- 范围构造器:range constructor
- 复制构造器: copy constructor
例子
#include<vector>
#include<iostream>
using namespace std;
void print(vector<int> temp)
{
cout<<endl;
for(auto x: temp)
cout<<x<<" ";
cout<<endl;
}
int main(){
vector<int> v1; // 默认构造器
vector<int> v{1,2}; // 默认构造器
vector<int> v2(6,10); //批量构造器
vector<int> v3(v2.begin(),v2.begin()+5); //范围构造器
vector<int> v4(v); //复制构造器
print(v);
print(v2);
print(v3);
print(v4);
return 0;
}
输出
1 2
10 10 10 10 10 10 //六个10
10 10 10 10 10
1 2
push_back
&& pop_back
vector
最常用的成员函数,在尾部插入和删除
assign
int main(){
vector<int> test;
test.assign(2,3); //批量构造,构造两个值为 3 的 element
print(test);
test.assign(2,8); //会覆盖原有值
print(test);
}
insert
在指定位置插入一个或多个值,(位置的类型是迭代器
),但若是插入操作过多,使用vector
时间复杂度会非常高
vector
中插入值时,会将插入值后的所有值依次后移
重载函数 | 形参 |
---|---|
插入单个值[1] | iterator insert (const_iterator position, const value_type& val); |
多个重复值[2] | iterator insert (const_iterator position, size_type n, const value_type& val) |
range (3) | iterator insert (const_iterator position, InputIterator first, InputIterator last) |
vector<int> test;
test.assign(2,3); //批量构造,构造两个值为 3 的 element
print(test);
test.assign(2,8); //会覆盖原有值
print(test);
vector<int> test1(test);
test.insert(test.begin(),3); //[1]
print(test);
auto ite =test.insert(test.begin(),test1.begin(),test1.end());//[3]
print(test);
cout<<*ite<<endl; //insert 返回指针地址
输出
3 3
8 8
3 8 8
8 8 3 8 8
8
erase
删除指定秩的值
重载函数 | 形参 |
---|---|
single | iterator erase (const_iterator position) |
range | iterator erase (const_iterator first, const_iterator last) |
vector<int> test;
test.assign(4,3); //批量构造,构造两个值为 3 的 element
test.push_back(66);
cout<<"initial element\n";
print(test);
test.erase(test.end()-1); //删除尾部元素,注意不要越界
print(test);
test.erase(test.begin(),test.end()-2);//删除操作依旧复杂度高,容易TLE
print(test);
输出
initial element
3 3 3 3 66
3 3 3 3
3 3
empty
如果vector
为空,empty
返回true
;
函数头 |
---|
bool empty() const noexcept |
size
返回vector
容器元素个数
emplace
&& emplace_back
C++11
的新特性,在几乎所有的容器中都插入了这一函数,这一函数功能类似于insert
,但是开销远小于insert
,它不产生临时变量,具体移步emplace介绍
函数头 |
---|
iterator emplace (const_iterator position, Args&&… args) |
emplace
的另一个新特性是不必显式构造
vector<pair<int,double>> vec;//vector 中嵌套 pair
vec.push_back(make_pair(1,1.0));//常用的构造方式
vec.emplace(vec.end(),1,2.0);//emplace 的构造方式
方便是方便,但简单的尾部插入还要写地址
,岂不繁琐, 当然不是,C++11也提供了emplace_back
这一函数
vec.emplace_back(1,2.0);//emplace_back 的构造方式 ,不需写尾部地址
resize
更改vector
中element
个数
std::vector<int> myvector;
// set some initial content:
for (int i=1;i<10;i++) myvector.push_back(i);
myvector.resize(5);//缩小容量到5,尾部多余的`element`被删除
myvector.resize(8,100);//扩容到8,用100填值
myvector.resize(12);//使用0填值
输出
1 2 3 4 5 100 100 100 0 0 0 0
clear
删除vector
中的所有元素,如果有析构函数
调用各自的析构函数
,但是clear
不删除vector
的容量,
vector 的容量是自身占用的内存值,不是其中包含的
element
的具体大小,为了效率考虑,vector分配的内存值都是大于或等于已使用的内存值
例子
vector<pair<int,double>> vec;//vector 中嵌套 pair
vec.push_back(make_pair(1,1.0));//常用的构造方式
vec.emplace_back(1,2.0);//emplace_back 的构造方式
cout<<vec.capacity()<<" "<<vec.size()<<endl;
vec.clear();
cout<<vec.capacity()<<" "<<vec.size()<<endl;
输出
2 2
2 0//容量是不变的
对于即将再次被使用的容器,这样做效率无疑更高,但对于即将丢弃的vector
,有没有可以彻底善后的方法
swap
该函数用于交换两个vector
容器的内容,那么假如交换一个空vector
呢?
using pa =pair<int,double> ;
vector<pair<int,double>> vec;//vector 中嵌套 pair
vec.push_back(make_pair(1,1.0));//常用的构造方式
vec.emplace_back(1,2.0);//emplace_back 的构造方式
cout<<vec.capacity()<<" "<<vec.size()<<endl;
vec.clear();
cout<<vec.capacity()<<" "<<vec.size()<<endl;
vector<pa> (vec).swap(vec); // 交换一个空容器
cout<<vec.capacity()<<" "<<vec.size()<<endl;
输出
2 2 //初始容量
2 0 //调用clear后
0 0 //交换空容器后,整个vector 全部清空了
几乎很少会在算法题中使用,贸然使用可能会弄巧成拙
list
用于频繁删除,插入导致TLE
的题目
构造函数
一下所有容器的构造函数都于前文vector
类似,不在重提
增删
函数名 | 函数头 |
---|---|
emplace_front | void emplace_front (Args&&… args) 右值引用 |
emplace_back | void emplace_back (Args&&… args) |
emplace | iterator emplace (const_iterator position, Args&&… args) |
push_front | void push_front (value_type&& val) |
pop-front | void pop_front() |
push_back | void push_back (value_type&& val) |
pop_back | void pop_back() |
erase [1] | iterator erase (const_iterator position) 形参:地址 |
erase [2] | iterator erase (const_iterator first, const_iterator last) |
remove [3] | void remove (const value_type& val) 形参: 值 |
remove_if [4] | void remove_if (Predicate pred) |
备注
erase
[1] : 单值删除erase
[2]: 范围删除erase
和remove
的区别: 删除特定地址
和删除`特定值``remove
[3]: 删除满足值的所有元素remove_if
[4]: 传入具体判断函数,see here, 可以使用lambda
工具函数
函数名 | 函数头 |
---|---|
unique [1] | void unique() |
unique [2] | void unique (BinaryPredicate binary_pred) |
sort [3] | void sort() |
sort [4] | template void sort (Compare comp) |
merge [5] | void merge (list&& x) |
merge [6] | template void merge (list&& x, Compare comp) |
front [7] | reference front() |
back | reference front() |
备注
- [1]
unique
: 去重 - [2]
unique
: 传入自定函数,或重载操作符,可使用Lambda
- [3]
sort
: 排序,默认升序 - [5]
merge
: 将另一个list
合并 - [6]
merge
: 在第二个形参里传入自定函数
- [7]
front
: 返回头值, 注意是: 引用
set
set
中不允许存在重复值
函数名 | 函数头 |
---|---|
insert | pair<iterator,bool> insert (value_type&& val) |
insert [1] | void insert (initializer_list<value_type> il) |
insert [2] | iterator insert (const_iterator position, value_type&& val) |
erase | size_type erase (const value_type& val) |
erase | iterator erase (const_iterator first, const_iterator last) 用的很少 |
erase | iterator erase (const_iterator position) |
emplace [3] | pair<iterator,bool> emplace (Args&&… args) |
备注
- [1]
insert
: 范围插入 - [3]
emplace
: 适合插入复合数据类型
工具函数
函数名 | 函数头 |
---|---|
find [4] | iterator find (const value_type& val) |
count | size_type count (const value_type& val) const |
lower_bound [1] | iterator lower_bound (const value_type& val); |
uppder_bound [2] | iterator upper_bound (const value_type& val) |
equal_range [3] | pair<iterator,iterator> equal_range (const value_type& val); |
备注
- [1]
lower_bound
: 表示查找>= x
的元素中最小的一个,并返回指向该元素的迭代器 - [2]
uppder_bound
: 表示查找>x
的元素中最小的一个,并返回指向该元素的迭代器 - [3]
equal_range
: 返回[1]
和[2]
的pair
类型 - [4]
find
: 没有找到返回set::end