当前位置:首页 » 《随便一记》 » 正文

CCF-CSP考试复习准备资料汇总(同样适用于所有算法比赛,程序设计竞赛),超级详细,超级全面!容器篇(文章包含所有常见容器及其常用函数)

5 人参与  2024年10月09日 13:20  分类 : 《随便一记》  评论

点击全文阅读


(温馨提示:本文章适合有一定基础的同学考前熟悉)

包含:vector,stack,queue,map,set,pair,string等常见容器的定义、常用函数及注意事项。

超级详细,超级全面,考个350绝对够用了!(大佬也不会来看我这个的)

第一次正式写东西,好多东西用不熟练,之后会慢慢改进的,大家请多指教!


Vector

指定长度初始值初始化

        vector<int> v(n);        // 定义一个长度为n的数组,初始值默认为0,下标范围[0, n - 1]

        vector<int> v(n, 1);    // v[0] 到 v[n - 1]所有的元素初始值均为1

        //注意:指定数组长度之后(指定长度后的数组就相当于正常的数组了)

初始化中有多个元素

        vector<int> a{1, 2, 3, 4, 5};//数组a中有五个元素,数组长度就为5

常用函数:

c.front()                          //返回第一个数据O ( 1 ) O(1)O(1)

c.back()                          //返回数组中的最后一个数据 O ( 1 ) O(1)O(1)

c.pop_back()                  //删除最后一个数据O ( 1 ) O(1)O(1)

c.push_back(element)   //在尾部加一个数据O ( 1 ) O(1)O(1)

c.size()                           //返回实际数据个数(unsigned类型)O ( 1 ) O(1)O(1)

c.clear()                          //清除元素个数O ( N ) O(N)O(N),N为元素个数

c.resize(n, v)                  //改变数组大小为n,n个空间数值赋为v,如果没有默认赋值为0

c.insert(it, x)                   //向任意迭代器it插入一个元素x ,O ( N ) O(N)O(N)

       //例:c.insert(c.begin() + 2,-1)      //将-1插入c[2]的位置

c.erase(first,last)            //删除[first,last)的所有元素,O ( N ) O(N)O(N)

c.begin()                        //返回首元素的迭代器(通俗来说就是地址)O ( 1 ) O(1)O(1)

c.end()                           //返回最后一个元素后一个位置的迭代器(地址)O ( 1 ) O(1)O(1)

c.empty()                       //判断是否为空,为空返回真,反之返回假 O ( 1 ) O(1)O(1)

sort(c.begin(), c.end());

vector<int> a(n + 1);

sort(a.begin() + 1, a.end()); // 对[1, n]区间进行从小到大排序

访问:

vector<int> vi;                                 //定义一个vi数组

vector<int>::iterator it = vi.begin();  //声明一个迭代器指向vi的初始位置


stack

常用函数:

s.push(ele)     元素ele入栈,增加元素 O ( 1 ) O(1)O(1)

s.pop()           移除栈顶元素 O ( 1 ) O(1)O(1)

s.top()            取得栈顶元素(但不删除)O ( 1 ) O(1)O(1)

s.empty()        检测栈内是否为空,空为真 O ( 1 ) O(1)O(1)

s.size()           返回栈内元素的个数 O ( 1 ) O(1)O(1)

 栈遍历:

stack<int> st;

for (int i = 0; i < 10; ++i) st.push(i);

while (!st.empty()) {

    int tp = st.top(); // 栈顶元素

    st.pop(); 

}


Queue

常用函数:

q.front()                返回队首元素 O ( 1 ) O(1)O(1)

q.back()                返回队尾元素 O ( 1 ) O(1)O(1)

q.push(element)   尾部添加一个元素element 进队O ( 1 ) O(1)O(1)

q.pop()                 删除第一个元素 出队 O ( 1 ) O(1)O(1)

q.size()                 返回队列中元素个数,返回值类型unsigned int O ( 1 ) O(1)O(1)

q.empty()              判断是否为空,队列为空,返回true O ( 1 ) O(1)O(1)

 priority_queue优先队列:

在正常队列的基础上加了优先级,保证每次的队首元素都是优先级最大的。底层是通过来实现的。

q.top()                  访问队首元素 O ( 1 ) O(1)O(1)

q.push()                入队 O ( l o g N ) O(logN)O(logN)

q.pop()                 堆顶(队首)元素出队 O ( l o g N ) O(logN)O(logN)

q.size()                 队列元素个数 O ( 1 ) O(1)O(1)

q.empty()              是否为空 O ( 1 ) O(1)O(1)

注意没有clear()! 不提供该方法

优先队列只能通过top()访问队首元素(优先级最高的元素)     

priority_queue<int> pq;         // 默认大根堆, 即每次取出的元素是队列中的最大值

priority_queue<int, vector<int>, greater<int>> q; // 小根堆, 每次取出的元素是队列中的最小值


map 

常用函数:

mp.find(key)                    返回键为key的映射的迭代器 $O(logN) $ 注意:用find函数来定位数据出现位置,它返回一个迭代器。当数据存在时,返回数据所在位置的迭代器,数据不存在时,返回m p . e n d ( ) mp.end()mp.end()

mp.erase(it)                     删除迭代器对应的键和值O ( 1 ) O(1)O(1)

mp.erase(key)                 根据映射的键删除键和值 O ( l o g N ) O(logN)O(logN)

mp.erase(first,last)          删除左闭右开区间迭代器对应的键和值 O ( l a s t − f i r s t ) O(last-first)O(last−first)

mp.size()                      返回映射的对数$ O(1)$

mp.clear()                    清空map中的所有元素O ( N ) O(N)O(N)

mp.insert()                   插入元素,插入时要构造键值对

mp.empty()                  如果map为空,返回true,否则返回false

mp.begin()                   返回指向map第一个元素的迭代器(地址)

mp.end()                      返回指向map尾部的迭代器(最后一个元素的下一个地址)

mp.rbegin()                 返回指向map最后一个元素的迭代器(地址)

mp.rend()                    返回指向map第一个元素前面(上一个)的逆向迭代器(地址)

mp.count(key)             查看元素是否存在,因为map中键是唯一的,所以存在返回1,不存在返回0

mp.lower_bound()        返回一个迭代器,指向键值>= key的第一个元素

mp.upper_bound()       返回一个迭代器,指向键值> key的第一个元素

用于正向遍历map :

map<int,int> mp;

mp[1] = 2;

mp[2] = 3;

mp[3] = 4;

auto it = mp.begin();

while(it != mp.end()) {

       cout << it->first << " " << it->second << "\n";

       it ++;

}

 用于逆向遍历map:

map<int,int> mp;

mp[1] = 2;

mp[2] = 3;

mp[3] = 4;

auto it = mp.rbegin();

while(it != mp.rend()) {

       cout << it->first << " " << it->second << "\n";

       it ++;

}

 其他:

map:内部用红黑树实现,具有自动排序(按键从小到大)功能。空间占用较大。

unordered_map:内部用哈希表实现,内部元素无序杂乱。查找速度非常快。

查询容器内部元素的最优方法是:先判断存在与否,再索引对应值(适用于这两种容器)


set

常用函数:

元素不会重复,元素自动从小到大排序。

s.begin()                      返回set容器的第一个元素的地址(迭代器)O ( 1 ) O(1)O(1)

s.end()                         返回set容器的最后一个元素的下一个地址(迭代器)O ( 1 ) O(1)O(1)

s.rbegin()                     返回逆序迭代器,指向容器元素最后一个位置O ( 1 ) O(1)O(1)

s.rend()                        返回逆序迭代器,指向容器第一个元素前面的位置O ( 1 ) O(1)O(1)

s.clear()                       删除set容器中的所有的元素,返回unsigned int类型O ( N ) O(N)O(N)

s.empty()                     判断set容器是否为空O ( 1 ) O(1)O(1)

s.insert()                      插入一个元素

s.size()                         返回当前set容器中的元素个数O ( 1 ) O(1)O(1)

erase(iterator)              删除定位器iterator指向的值

erase(first,second)     删除定位器first和second之间的值

erase(key_value)          删除键值key_value的值       

s.find(element)            查找set中的某一元素,有则返回该元素对应的迭代器,无则返回结束

s.count(element)          查找set中的元素出现的个数,由于set中元素唯一,此函数相当于查询element是否出现

s.lower_bound(k)         返回大于等于k的第一个元素的迭代器O ( l o g N ) O(logN)O(logN)

s.upper_bound(k)         返回大于k的第一个元素的迭代器O ( l o g N ) O(logN)O(logN)

其他:

重载<运算符 改变set排序规则,set中默认使用less比较器,即从小到大排序。

set<int> s1; // 默认从小到大排序

set<int, greater<int> > s2; // 从大到小排序

multiset:元素可以重复,且元素有序

unordered_set :元素无序且只能出现一次

unordered_multiset : 元素无序可以出现多次


 pair

p[i].first   p  [i].second;        emmm.......pari 好少,好可怜?


 string

介绍一下:

支持比较运算符
string字符串支持常见的比较操作符(>,>=,<,<=,==,!=),支持string与C-string的比较(如 str < "hello")。

支持+运算符,代表拼接字符串
string字符串可以拼接,通过"+"运算符进行拼接。

 输入输出讲究:

读入字符串,遇空格,回车结束

string s;

cin >> s;

读入一行字符串(包括空格),遇回车结束

string s;

getline(cin, s);

cin cout解锁使用时,不能与 scanf,getchar, printf,cin.getline()混用,一定要注意,会出错。

常用函数:

获取字符串长度

s.size()和s.length() 返回string对象的字符个数,他们执行效果相同。

s.max_size()                 返回string对象最多包含的字符数,超出会抛出length_error异常

s.capacity()                  重新分配内存之前,string对象能包含的最大字符数

插入

s.push_back()                      在末尾插入

例:s.push_back('a')           末尾插入一个字符a

s.insert(pos,element)           在pos位置插入element

例:s.insert(s.begin(),'1')在第一个位置插入1字符

s.append(str)                      在s字符串结尾添加str字符串

例:s.append("abc")           在s字符串末尾添加字符串“abc”

删除

erase(iterator p)                         删除字符串中p所指的字符

erase(iterator first, iterator last)   删除字符串中迭代器区间[first,last)上所有字符

erase(pos, len)                           删除字符串中从索引位置pos开始的len个字符

clear()                                        删除字符串中所有字符

字符替换

s.replace(pos,n,str)       把当前字符串从索引pos开始的n个字符替换为str

s.replace(pos,n,n1,c)    把当前字符串从索引pos开始的n个字符替换为n1个字符c

s.replace(it1,it2,str)       把当前字符串[it1,it2)区间替换为str it1 ,it2为迭代器哦

大小写转换

法一:

tolower(s[i])   转换为小写

toupper(s[i])   转换为大写

法二:

string s;

transform(s.begin(),s.end(),s.begin(),::tolower);//转换小写

transform(s.begin(),s.end(),s.begin(),::toupper);//转换大写

分割

s.substr(pos,n)      截取从pos索引开始的n个字符

查找

s.find (str, pos)                           在当前字符串的pos索引位置(默认为0)开始,查找子串str,返回找到的位置索引,-1表示查找不到子串

s.find (c, pos)                             在当前字符串的pos索引位置(默认为0)开始,查找字符c,返回找到的位置索引,-1表示查找不到字符

s.rfind (str, pos)                          在当前字符串的pos索引位置开始,反向查找子串s,返回找到的位置索引,-1表示查找不到子串

s.rfind (c,pos)                             在当前字符串的pos索引位置开始,反向查找字符c,返回找到的位置索引,-1表示查找不到字符

s.find_first_of (str, pos)                在当前字符串的pos索引位置(默认为0)开始,查找子串s的字符,返回找到的位置索引,-1表示查找不到字符

s.find_first_not_of (str,pos)          在当前字符串的pos索引位置(默认为0)开始,查找第一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到字符

s.find_last_of(str, pos)                 在当前字符串的pos索引位置开始,查找最后一个位于子串s的字符,返回找到的位置索引,-1表示查找不到字符

s.find_last_not_of ( str, pos)         在当前字符串的pos索引位置开始,查找最后一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到子串

排序       sort(s.begin(),s.end());  //按ASCII码排序

我就想问一下,谁能比我细!


点击全文阅读


本文链接:http://zhangshiyu.com/post/169468.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1