c++ 一些库函数学习使用(持续更新)

函数调用时用的是(),你调用vector,数组之类的第几个元素时是[]; 


reverse() 作用:翻转容器元素

时间复杂度 O(n),蛮好理解的,遍历一次所有元素就可以了;

调用:reverse(a.begin(),a.end());  你可以把begin当成0来看,但是注意,这里有a.end(),这说明reverse内是左闭右开的;


insert() 作用:添加元素

时间复杂度:O(n);

添加完后,就会把其他元素往后移动;

调用方法:insert(iter,'.');在指定的位置加入. set用的是这个,不用push_back();


erase()  作用:移除元素

时间复杂度:O(n);

移除完后,就会把其他元素往前移,因此时间复杂度就是一个for;

调用方法: vector<int> myvec;  myvec.erase(myvec.begin()+i);


sort() 作用:快速排序;

时间复杂度:O(nlogn)

调用方法:sort(s.begin(),s.end(),comp),左闭右开,默认升序,第三个参数是升降序;默认为升序,如果是结构体的比较的话就要自定义一个函数 >降序,<升序;

这段代码,[&]表示外部引用到了values作为比较大小的根据;甚至有两个分号;

标准的是升序,如果你想要降序:
sort(s.begin(),s.end(),greater<int>());

sort(s.begin(),s.end(),[&](int i,int j){ return values[i]>values[j]; });

大顶堆:

priority_queue<pair<int,int>,vector<pair<int,int>>,decltype(cmp)> mq(cmp);

对于mq,传参时不用构造{};

因为传进去的时候会通过pair<int,int>构造,

所以应该先传int,int ->pair<int,int>->vector<pair<int,int>>;


count() 用法:查询并返回个数;

时间复杂度:O(n);

调用方法:int count_of_3 = count(v.begin(), v.end(), 3);

需要注意的是,count() 函数只适用于顺序容器,如 vector、list、deque 等。对于无序容器,如 unordered_map、unordered_set 等,则需要使用其对应的成员函数 count(),其时间复杂度为 O(1)。


字符串的处理方法 

substr():获取字符串的子字符串;

调用方法:s.substr(s.begin(),num); 给定一个起始的迭代器,num代表需要的个数;这样就能获取string,有些时候需要string而不是char,遍历string获取的是char;

调用方法:最近发现,substr(num,num)也是可以的,用迭代器反而不行;

to_string(); 返回一个string,调用方法也是to_string(num,num),第二个num代表选取的元素数量,发现都没有用迭代器的;也可以只对一个num进行操作;

123456->"123456"

stoi() : stoi 的参数是 const string* 类型,把string转成int,越界了会报错;

用法 stoi(string a);

"123456"->123456

获取首尾字符 

string.front();

string.back(); 

queue用的也是front,不知道vec支不支持front,string支持front()和back()获取首位元素


assign()

调用方法:f.assign(n, vector<int>(n, true)); 可视化一下给朋友们看看,生成了一个33的矩阵,以一个vector<int>(3,1)为基准生成矩阵;

f.assign(3, vector<int>(3, true));

ans:
  0 1 2
0 1 1 1
1 1 1 1
2 1 1 1

.find() 作用:查找元素是否存在;

调用方法:myset.find() ; 返回iter,如果存在则返回元素对应的迭代器,如果不存在则返回end();


memset(void *s,int c,unsigned long n);

函数功能:为指针变量s所指的前n个字节的内存单元填充给定的int型数值c,它可以为任何数据进行初始化。换句话说,就是将数值c以单个字节逐个拷贝的方式放到指针变量s所指的内存中去。 注意:只将数值c的最低一个字节填充到内存。

嫖的例子和解释:

char arr[4];
memset(arr,1,4);

        那就代表:

        仅仅将数组arr的前四个字节,也就是:第一个元素的全部4个字节当中的每个字节,都变成了1。

        众所周知:1B=8bit,那么就是将这个元素的每个字节都变成了0000 0001,合起来数组arr的第一个元素也就是0x01010101。

        而后三个元素还是未分配内容的状态。

        故,我们可以浅认为:

        memset的作用是:为大空间结构体或大数组空间初始化或清零。


lower_bound 基于二分查找 O(logn);

函数声明如下:

template<class ForwardIt, class T>
ForwardIt lower_bound(ForwardIt first, ForwardIt last, const T& value);

lower_bound 的返回值是一个迭代器,它指向序列中第一个大于等于 value 的元素。

如果序列中没有大于等于 value 的元素,则 lower_bound 返回指向序列中第一个大于 value 的元素的迭代器,或者返回 last。跟find()差不多;不过这个有大于等于的好处;

如果找不到的话就返回.end();

扩展1:查询下标

lower_bound(vec.begin(),vec.end(),target)-vec.begin()//获取下标

扩展2:查询容器元素个数

vec.end()-vec.begin();


static_cast<type>

static_cast<type>(expression)

其中,type 表示要转换的目标类型,expression 表示要进行类型转换的表达式。

static_cast 可以进行多种类型转换,包括:

  • 基本数据类型的转换,例如 intdoublecharint 等。
  • 指针类型的转换,例如 void* 到其他指针类型、基类指针到派生类指针等。
  • 引用类型的转换,例如 将 const 引用转换为非 const 引用。
  • 将枚举类型转换为整数类型。

在给定的代码中,static_cast<int> 用于将迭代器之间的距离转换成 int 类型,以便计算子数组的长度,并将结果传递给 min 函数比较大小。

举例:

static_cast<int>((bound - sums.begin()) - (i - 1))

是将一个迭代器之间的距离转换成 int 类型的表达式。


.back() 作用:获取容器最后元素;

挺好的,比nums.size()-1好使


iota(id.begin(), id.end(), 0) 来将 id 数组初始化为连续的整数序列,值从0~n-1;


resize(); 作用:重构大小;


accumulate():作用,累加,合成;

作用范围:int;

int sum = accumulate(vec.begin() , vec.end() , 42);

在42的基础上累加vec,返回值和第三个参数相同;

string sum = accumulate(v.begin() , v.end() , string(" "));

将string型的vec的元素连起来; 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值