hr给了大致的范围,然后我做了点答案的总结
C++机试及面试手撕题参考复习范围
基本类型、函数和容器的使用
int
long
char
string
vector
map
queue
set
进制转换
二进制 std::bitset or bitset<n>() n是输出的位数
八进制 std::oct
十进制 std::dec
十六进制 std::hex
数字转字符
sprintf()(不能指定的版本,存在安全隐患)
snprintf()(可以指定写入的字符的最大数目n,安全)
to_string()
字符转数字
stoi() (字符转整形)
stof() (字符转浮点数)
strtol()(任意2-36进制数转化为10进制数)
itoa()(可以将一个10进制数转换为任意的2-36进制字符串)
unordered_map
first, 指向键 (*it).first; it->first;
second, 指向值 (*it).second; it->second;
// 迭代器操作,可以简单理解成下标
for (auto t =m.begin(); t != m.end(); ++t){}
for (i: m){}count(), 查找无序map中元素为指定键值的元素的数量,因为无序map不允许重复的键值,因此如果能找到该元素,则返回1,否则返回0。
m.find(元素)!=m.end(), 根据键值,查找某个元素,返回迭代器,如果没找到元素
erase(), 通过指定键值或者迭代器,可以删除元素。m.erase(m.begin()); 通过指定迭代器 m.erase(1); 通过指定键值,erase(beg, end); 删除区间[beg,end)的所有元素
insert(make_pair(key, value)) 插入元素,如果是重复键值,注意,该插入将会被忽略。
clear() 清空容器内容。
empty() 判断是否为空容器。
size() 返回容器大小。
swap() a.swap(b); //b为map,将a中的元素和b中的元素进行整体性交换,,有点像互换了名字
vector
如何创建m行n列初始化为0的数组
vector<vector<int>> v(m, vector<int>(n))
vector<int> v ; iota(v.begin(), v.end(), 初始值); //初始化初始值往上增1,
vector<int> L4(5); 初始化5个0
vector<int> L5(5,2); 初始化5个2,
vector<int> L = {1,5,3,10,4,-1};确定元素初始化如何全排列(next_permutation),sort(n1.begin(),n1.end()); //next_permutation要升序排列,否则会漏算 do t4.push_back(n1[0]+n1[1]+n1[2]+n1[3]);while(next_permutation(n1.begin(),n1.end()));sort(n2.begin(),n2.end());reverse(n2.begin(),n2.end()); //prev_permutation要降序排列do t3.push_back(n2[0]+n2[1]+n2[2]+n2[3]);while(prev_permutation(n2.begin(),n2.end()));
push_back() 在最后添加
pop_back() 在最后删除
front() 返回第一个元素
back() 返回最后一个元素
insert() a.insert(a.begin()+1,5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4a.insert(a.begin()+1,3,5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5a.insert(a.begin()+1,b+3,b+6); //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8
a.find(元素)!=a.end(), 根据值,查找某个元素,返回迭代器,如果没找到元素
count() 返回某个元素数量 find count之类的函数对于迭代器都是通用的
size() 返回a中元素的个数
empty() 判断是否为空
clear() 清空中的元素
erase() 删除也是三类 通过指定迭代器 指定区间,指定值
swap() a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换
a.rezize(10); //将a的现有元素个数调至10个,多则删,少则补,其值随机
a.rezize(10,2); //将a的现有元素个数调至10个,多则删,少则补,其值为2
string
+ 字符串的拼接,相当于重载了+操作符 s1.append(s2);这个也是连接
- 似乎没有字符串减法吧
=<> 字符串对比主要是用于比较两个字符串是否相等,判断谁大谁小的意义并不是很大
compare() s1.compare(s2) 相等时返回0;s1>s2时返回1,s1<s2时返回-1
s.size() 大小,长度 s.length();
empty() 是不是为空,我常用size()==0 判断
insert() 插入 s.insert(p,t);//在迭代器p指向的元素之前插入一个值为t的新元素string str="hello";string s="Hahah";str.insert(1,s);//在原串下标为1的字符e前插入字符串ss.insert(p,n,t);//在迭代器p指向的元素之前插入n个值为t的新元素string str1="hello";char c='w';str1.insert(4,5,c);//在原串下标为4的字符o前插入5个字符cstring str2="hello";string s2="weakhaha";str2.insert(0,s2,1,3);//将字符串s2从下标为1的e开始数3个字符,分别是eak,插入原串的下标为0的字符h前
c_str() 字符串转字符数组strcpy(str,s.c_str());
s=str str为char数组,s为string类型
replace() 替换字符 string &replace(iterator first0, iterator last0,const char *s);//把[first0,last0)之间的部分替换为字符串sstring &replace(int p0, int n0,const char *s);//删除从p0开始的n0个字符,然后在p0处插入串sstring &replace(int p0, int n0,int n, char c);//删除p0开始的n0个字符,然后在p0处插入n个字符c
find() s.find(t); t可以是字符,也可以是子串 s.rfind();从后往前找,
sort() 排序string s[100]; 对string类型数组排序sort(s,s+n,cmp);int cmp(string a,string b){return a<b; //或a>b;}
下标 s[i] 下标访问,就跟数组一样,可以简单理解为字符串就是个字符数组
clear() 删除全部字符
swap() 交换两个字符串的内容
substr() 返回某个子字符串s.substr();//返回s的全部内容s.substr(11);//从索引11往后的子串s.substr(5,6);//从索引5开始6个字符
deque 感觉和vector基本一致
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素
push_front() 在 queue 的头部添加
push_back() 在 queue 的尾部添加一个元素的副本
pop_back() 删除 queue 中的最后一个元素 尾元素
pop_front() 删除 queue 中的第一个元素 头元素
size() 返回 queue 中元素的个数。
empty() 如果 queue 中没有元素的话,返回 true
swap() a.swap(b); //b为队列,将a中的元素和b中的元素进行整体性交换
deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
insert()insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
clear(); //清空容器的所有数据
erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos); //删除pos位置的数据,返回下一个数据的位置下标,迭代器 基本所有的都有这三种取值方式
priority_queue优先队列(默认大堆顶,也可以自定义为小堆顶)
优点: 自动排序
优先队列没有back()操作!
声明都差不多
priority_queue <int> i;
priority_queue <double> d;q.size();//返回q里元素个数
q.empty();//返回q是否为空,空则返回1,否则返回0
q.push(k);//在q的末尾插入k
q.pop();//删掉q的第一个元素
q.top();//返回q的第一个元素 头元素,就是按排序后的顺序
queue
push(elem); //往队尾添加元素
pop(); //从队头移除第一个元素
back(); //返回最后一个元素 尾
front(); //返回第一个元素 头
empty(); //判断堆栈是否为空
size(); //返回栈的大小
stack
push(elem); //向栈顶添加元素
pop(); //从栈顶移除第一个元素
top(); //返回栈顶元素
empty(); //判断堆栈是否为空
size(); //返回栈的大小
set,map:默认有序,对自定义结构需要自定义比较方法用于排序(延伸:如何自定义?)
利用仿函数重载().其实如果对map的值排序我用的更多是sort函数,然后自己写一个排序的方法当参数
以上很多容器都具有迭代器,迭代器的使用是共通的,有的方法我可能只在一个容器下列了,但实际上很多容器都可以用,切记要主动实践,灵活使用。