函数调用时用的是(),你调用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
可以进行多种类型转换,包括:
- 基本数据类型的转换,例如
int
到double
、char
到int
等。 - 指针类型的转换,例如
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的元素连起来;