C++ STL 简要用法

纵然STL里的许多实现在有些时候充满了玄学气息,但有些时候STL还是能大大缩短编码的时间,这里不涉及内部实现原理

vector

C++ reference : 详细参考信息

头文件

#include<vector>

构造器 && 初始化

  1. 默认构造器:empty container constructor
  2. 批量构造器:fill constructor
  3. 范围构造器:range constructor
  4. 复制构造器: 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

删除指定秩的值

重载函数形参
singleiterator erase (const_iterator position)
rangeiterator 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

更改vectorelement个数

	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_frontvoid emplace_front (Args&&… args) 右值引用
emplace_backvoid emplace_back (Args&&… args)
emplaceiterator emplace (const_iterator position, Args&&… args)
push_frontvoid push_front (value_type&& val)
pop-frontvoid pop_front()
push_backvoid push_back (value_type&& val)
pop_backvoid 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]: 范围删除
  • eraseremove的区别: 删除特定地址和删除`特定值``
  • 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()
backreference front()

备注

  • [1] unique: 去重
  • [2] unique: 传入自定函数,或重载操作符,可使用Lambda
  • [3] sort: 排序,默认升序
  • [5] merge: 将另一个list合并
  • [6] merge: 在第二个形参里传入自定函数
  • [7] front: 返回头值, 注意是: 引用

set

set中不允许存在重复值

函数名函数头
insertpair<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)
erasesize_type erase (const value_type& val)
eraseiterator erase (const_iterator first, const_iterator last) 用的很少
eraseiterator erase (const_iterator position)
emplace[3]pair<iterator,bool> emplace (Args&&… args)

备注

  • [1]insert: 范围插入
  • [3]emplace: 适合插入复合数据类型

工具函数

函数名函数头
find[4]iterator find (const value_type& val)
countsize_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

神秘链接

Yanyan的小屋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值