本文围绕 C++ 的Syntax, Data Structures, Algorithms以及STL和相关高频应用进行集中攻克,既能提升在 C++ 面试前的准备效率,也能提前把握实际工作中的 C++ 要点。
C++ STL(标准模板库) 是一套C++模板类,提供通用的模板类和函数 容器-Containers:用于管理某一类对象的集合 算法-Algorithms:作用于容器,提供了执行各种操作的方式 迭代器-Iterators:用于遍历对象集合的元素 向量 Vector:能够存放任意类型的动态数组 1.顺序序列:元素按线性顺序排序;可通过元素在序列中的位置访问对应的元素 2.动态数组:对序列中任意元素进行快速直接访问;提供在序列末尾相对快速地添加/删除元素 C++中两种输入输出方式: cin、cout;效率低;因为输出时将内容先放入缓冲区再输出 使用ios::sync_with_stdio(false);使内容不在缓存直接输出
1.main综合模板 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include <iostream> #include <cstring> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sstream> #include <math.h> #include <vector> #include <queue> #include <stack> #include <algorithm> #include <unordered_set> #include <map> using namespace std;int main (void ) { return 0 ; }
2.数组排序库 1 2 int a[5 ] = {1 , 3 , 4 , 2 , 5 };sort (a, a + 5 );
3.字符串库 1 2 3 4 5 6 string s; int pos = s.find ("afsd" ); int pos = s.find ("afsd" , 5 ) string s2 = s.substr (2 , 5 ); string s2 = s.substr (2 ); int = atoi (s.c_str ());
4.向量vector的基本用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 vector<int > s; s.pop_back (); s.push_back (<int >); int = s.size (); bool = s.empty (); <int > = s.front (); <int > = s.back (); s.clear (); s.insert ( s.begin () + n, <int >); vector<int > s2; s.insert ( s.begin () + n, s2.begin (), s2.end ()); s.erase (s.begin () + n); s.erase (s.begin () + n, s.begin () + m); find (s.begin (), s.end (), int ) == s.end ();
5.vector初始化 1 2 3 4 5 6 7 8 9 int a[5 ] = {1 , 2 , 3 , 4 , 5 };vector<int > s (a, a+5 ) ; vector<vector<int >> s (a, vector <int >(b)); std::vector<int > v1 (3 ) ; std::vector<int > v2 (5 , 2 ) ; std::vector<int > v3 (3 , 1 , v2.get_allocator()) ; std::vector<int > v4 (v2) ; std::vector<int > v5 (v4.begin() + 1 , v4.begin() + 3 ) ;
6.Vector排序 1 2 3 4 5 6 7 8 9 10 11 sort (s.begin (), s.end ()); bool sortFun (int & x, int & y) { return x < y; } sort (num.begin (), num.end (), sortFun); reverse (s.begin (), s.end ());
7.栈queue的基本用法 1 2 3 4 5 6 7 8 queue<int > s; s.front (); s.back (); s.pop (); s.push (); s.size (); s.empty (); s = queue <int >();
8.堆stack的基本用法 1 2 3 4 5 6 stack<int > s; s.top (); s.pop (); s.push (); s.size (); s.empty ();
9.hashmap的基本用法(构建一一映射的关系) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 map<k, v> m; map<k, v> m2 (m) ; map<k, v> m3 (m.begin() + b, m.begin() + e) ; map<string , int > m; m["ABC" ] = 123 ; m["DEF" ] = 456 ; m.insert (pair <string, int >("GHI" , 789 )); m.insert (m.begin () ,pair <string, int >("GHI" , 789 )); m.insert ({ {"ABC" , 123 }, {"DEF" , 456 } }); m.erase (m.begin ()); m.erase ("ABC" ); map<string, int >::iterator index = m.find ("ABC" ); m.empty (); m.clear (); m.size (); m.max_size (); m.swap (m1);
10.数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 vector <int > a; vector <int > b (10 ); vector <int > c (10 , 2 ); a.size (); a.push_back (2 ); a.back (); a.pop_back (); sort (a.begin (), a.end ());for (vector<int >:: iterator it = a.begin (); it != a.end (); it++){ cout<<*it; } vector.erase (it); vector.insert (it, 2 ); *max_element (myVector.begin (), myVector.end ());
11.栈 1 2 3 4 5 6 stack <int > a; a.push (2 ); a.top (); a.pop (); a.empty (); a.size ();
12.队列 1 2 3 4 5 queue <int> a; a.push(1); a.front(); a.back(); a.pop();
13.字符串 1 2 3 4 5 6 7 8 9 string a; //默认"" a += 'd'; a += "ansjcknkj"; a.back(); //返回最后一个字符 string b = a.substr(1,5); //从位置1向后截取5个字符的子字符串 a.pop_back(); //去掉最后一个字符 string c = to_string(1); //整数to string c = to_string(1.98); //float to string int d = stoi("890"); //string to int
14.堆 1 2 3 4 5 6 7 heap(堆)C++默认实现优先队列就是用的堆,所以用优先队列会比较方便 priority_queue <int> a; //最大堆 priority_queue <int, vector<int>, greater<int> > b; //最小堆,节点值不大于两边子节点 a.push(1); a.pop(); a.top(); //返回堆顶元素
15.映射表 1 2 3 4 5 6 7 8 map <int, bool> a; a[0] = true; cout<<a[0]<<a[1]; //会输出true和false。如果映射表中不存在key值对应的元素,会根据默认构造函数赋值。 a[2]++; //a[2] = 1 map <int, bool>:: iterator it = a.find(12); //没找到会返回a.end() for(map<int, string>::iterator it = myMap.begin(); it != myMap.end(); it++){ cout<<it->first<<it->second; } //遍历映射表
16.奇技淫巧 16.1辗转相除法求最大公约数 1 2 3 4 5 int fun (int m,int n) { if (n==0 ) return m; return fun (n,m%n); }
16.2如何判断链表有环,并找出入环点 对于如何判断链表有环,可以从起点发出两个指针,一个一次一步,另一个一次两步,如果两个指针相遇,那么这个单链表就有环。 第一问得出相遇点后,再发出一个指针,统计这个指针再次回到这个点的距离,也就是环的距离。然后从起点再发出两个指针,一个指针在另一个前面,两个指针的距离就是环的距离,当两个指针再次相遇的时候就是环的入口。
16.3异或运算 可以快速判断多个项的相等结果 c = a⊕b //如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0 (a⊕b)⊕c = a⊕(b⊕c) 在判断数值是否相同时,可以通过异或运算快速判断 面,两个指针的距离就是环的距离,当两个指针再次相遇的时候就是环的入口。
16.4异或运算 可以快速判断多个项的相等结果 c = a⊕b //如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0 (a⊕b)⊕c = a⊕(b⊕c) 在判断数值是否相同时,可以通过异或运算快速判断