平时编码都用C,但是C刷算法效率太低,记录一些过程常用的c++基础语法;
输入输出cout cin
cout << "hello word";
cout << "enter two num for x y" << endl; // endl换行
cin >> x >> y;
cout << "x + y -> " << x + y << endl;
基础类型及操作
基本数据结构提示
char *p = new char[10]; // 分配一个内存给指针
delete [] p; // 回收内存
容器vector(类似数组)
定义 vector <类型> 变量名
vector <int> v1; // int类型构造器,默认为空
vector <int> v2(v1); // v1的副本
vector <int> v3(n, i); // 有n个元素,值为i
vector <int> v4(n); // 有n个元素,默认初值;
vector<vector<int>> dp(m, vector<int>(n)); // 初始化一个二位数组大小[m][n]
访问方式 用a[i]下标访问 用迭代器iterator访问
vector<int>obj(10, 1);
for(int i = 0; i < 10; i++) {
cout<<obj[i]<<" ";
}
vector<int>::iterator it;//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素
for(it=obj.begin();it!=obj.end();it++) { // begin表示第一个元素
cout<<*it<<" ";
}
常用操作 size成员个数、empty判空、push_back新增元素、pop_back去掉元素、clear 清空
vector<int>obj(10, 1);//创建一个向量存储容器 int, 初始里面有10个1
obj.push_back(5); // 新增一个成员,值为5
int size = obj.size(); // 取元素个数
obj.pop_back(); // 去掉一个元素
obj.clear(); // 清空obj
字符串string
定义 string
string s1; // 初始化一个空串
string s2(s1); // s2为s1副本
string s3("hello world"); // 初始化子串
string s4(n, 'c'); // 初始化n个字符c的副本
string s5 = "hello world"; // 创建后拷贝初始化
string s6 = string(s5,0,5); // "hello" 第0个字符开始,拷贝5个字符
常用操作 empty判空、length\size长度、insert插入、substr子串、replace替换、append追加
string s="ABAB";
cout << str.length() << str.size();
cout << s.substr(2) <<endl ; //输出AB
cout << s.substr(0,2) <<endl ; //同上
cout << s.substr(1,2) <<endl ; //输出BA
string s1("Limitless"), s2("00");
s1.insert(2, "123"); //在下标 2 处插入字符串"123",s1 = "Li123mitless"
s1.insert(3, s2); //在下标 2 处插入 s2 , s1 = "Li10023mitless"
s1.insert(3, 5, 'X'); //在下标 3 处插入 5 个 'X',s1 = "Li1XXXXX0023mitless"
string s1("Real Steel");
s1.replace(1, 3, "123456", 2, 4); //用 "123456" 的子串(2,4) 替换 s1 的子串(1,3) 输出 R3456 Steel
string s2("Harry Potter");
s2.replace(2, 3, 5, '0'); //用 5 个 '0' 替换子串(2,3) 输出 HaOOOOO Potter
int n = s2.find("OOOOO"); //查找子串 "00000" 的位置,n=2
s2.replace(n, 5, "XXX"); //将子串(n,5)替换为"XXX" 输出 HaXXX Potter
string s1("123"), s2("abc");
s1.append(s2); // s1 = "123abc"
s1.append(s2, 1, 2); // s1 = "123abcbc"
s1.append(3, 'K'); // s1 = "123abcbcKKK"
s1.append("ABCDE", 2, 3); // s1 = "123abcbcKKKCDE",添加 "ABCDE" 的子串(2, 3)
关联容器map(一对一hash表格)
定义map数据—自动建立key(要求唯一)-value的对应
map<int, string> mapStudent; // 定义一个map对象
常用操作— insert插入、erase删除、find查找、size元素个数、empty判空、clear清空
mapStudent[3] = "student_tree"; // 直接访问的方式插入
mapStudent.insert(pair<int, string>(0, "student_zero")); // 第一种 用insert函數插入pair<int, string>类型
mapStudent.insert(make_pair<int, string>(2,"student_two")); // 通过make_pair构造
mapStudent.insert(map<int, string>::value_type(1, "student_one"));
// 取值方式
map<int, string>::iterator iter = mapStudent.find(2); // 可以用 iter->second 来使用第二个值
string str = mapStudent[2]; // 不推荐,如果key不存在,会中增加这个key,而value就是缺省值
if (mapStudent.find(2) == mapStudent.end()) { // 找不到
cout << "not find!" << endl;
}
常用数据结构
链表定义
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
栈stack—empty判空、push入栈、pop弹出、top取顶、size元素个数
stack<int> s; // 定义栈
s.push(10); // 入栈
while(!s.empty()) { // 判空
s.pop(); // 出栈
}
int top = s.top(); // 取顶部
int size = s.size(); // 取元素个数
队列queue—empty判空、size元素个数、push入队、pop出队、front队首、back队尾
queue<int> q; //定义队列
for (int i = 0; i < 10; i++){
q.push(i);
}
cout << "q中有" << q.size() << "个元素" << endl;
cout << "队头元素为:" << q.front() << endl;
cout << "队尾元素为:" << q.back() << endl;
if (!q.empty()){ // 判空
q.pop(); // 删除队列首元素
}
return 0;
优先队列priority_queue(大/小 顶堆)—操作方式和队列类似
priority_queue<int> a; // 默认大顶堆,相当于 priority_queue <int,vector<int>,aless<int> >a 降序队列
priority_queue <int,vector<int>,greater<int> > c; // 升序队列,小顶堆
for (int i = 0; i < 5; i++) {
a.push(i);
c.push(i);
}
while (!a.empty()) {
cout << a.top() << ' '; // 输出 4 3 2 1 0
a.pop();
}
while (!c.empty()) {
cout << c.top() << ' '; // 输出 0 1 2 3 4
c.pop();
}
常用通用函数
比较大小 max(a, b) / min(a, b)
排序sort(左闭右开)、配合begin()、end()
vector<int>obj;
obj.push_back(1);
obj.push_back(3);
obj.push_back(0);
sort(obj.begin(),obj.end()); // 从小到大排序, 注意begin是第一个元素(包含),end是最后元素下一个位置(不包含);
bool cmp(int a,int b) {
return a > b;
}
sort(obj.begin(),obj.end()),cmp); // 从大到小
// 也可以模板
sort(obj.begin(),obj.end(),less<int>()); // 升序
sort(obj.begin(),obj.end(),greater<int>()). // 降序