不会有人大三了才知道打比赛不能用Java、python吧。这学期参加了天梯赛,就速学了一下C++的基本功能用来打比赛,最后水了一个国三,恭喜一下自己(bushi)
这篇主要基于Java的语法来解释C++,利于快速入门,只包含初、中级语法和一小部分算法,如继承多态那些高级语法则不在这里做介绍。
目录
头文件
万能头文件:#include<bits/stdc++.h>
包含所有的头文件,一个搞定
using namespace std;
using namespace std;
是一个命名空间(namespace)的声明,它告诉编译器在代码中使用标准库的名称空间 std
中的所有元素而不需要显式指定。标准库 std
包含了 C++ 标准库中的大部分内容,包括常用的类、函数和对象。
在 C++ 中,为了防止名称冲突,不同的库、框架或者用户自定义的代码通常会放在不同的命名空间中。标准库中的内容都被放在了命名空间 std
中,所以如果你想在代码中使用标准库的元素,通常需要在代码中加上 std::
前缀。例如,你可能会写 std::cout
表示标准输出流对象。
但是,通过 using namespace std;
的声明,你可以告诉编译器你要使用的是标准库中的内容,这样你就可以在代码中直接使用标准库的元素而不需要加上 std::
前缀。这样做虽然简化了代码,但可能会引起命名冲突,特别是当你使用了多个命名空间中的相同名称时。
输入
scanner.nextxx()
对应cin>>a
nextLine()
对应getline(cin,string s)
要吸收回车符,直接使用getchar()
STL
容量 | 查找 | 插入 | 存取 | 删除 | |
---|---|---|---|---|---|
string | int length() | int find(const string& str, int pos = 0) const; | |||
//查找s第一次出现位置,从pos开始查找 | |||||
int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找 | string& insert(int pos, const string& str); //插入字符串 | string& erase(int pos, int n = npos); //删除从Pos开始的n个字符 | |||
vector | size() | find(vecc.begin(), vecc.end(),要查找的值) | push_back(ele); //尾插 | ||
insert(const_iterator pos, ele); | front(); //返回容器中第一个数据元素 | ||||
back(); //返回容器中最后一个数据元素 | pop_back();//删除最后一个元素 | ||||
erase(const_iterator pos); //删除迭代器指向的元素,返回下一位置的迭代器 | |||||
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素 | |||||
deque | size() | push_back(elem); //在容器尾部添加一个数据 | |||
push_front(elem); //在容器头部插入一个数据insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。 | front(); //返回容器中第一个数据元素 | ||||
back(); //返回容器中最后一个数据元素 | pop_back(); //删除容器最后一个数据 | ||||
pop_front(); //删除容器第一个数据 | |||||
stack | size() | push(elem); //向栈顶添加元素 | top(); //返回栈顶元素 | pop(); //从栈顶移除第一个元素 | |
queue | size() | push(elem); //往队尾添加元素 | back(); //返回最后一个元素 | ||
front(); //返回第一个元素 | pop(); //从队头移除第一个元素 | ||||
list | size() | push_back(elem);//在容器尾部加入一个元素push_front(elem);//在容器开头插入一个元素 | |||
insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。 | |||||
front(); //返回第一个元素。 | |||||
back(); //返回最后一个元素。 | pop_back();//删除容器中最后一个元素pop_front();//从容器开头移除第一个元素 | ||||
erase(pos);//删除pos位置的数据,返回下一个数据的位置。remove(elem);//删除容器中所有与elem值匹配的元素。 | |||||
set/multiset | size() | find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end(); | insert(elem); //在容器中插入元素。 | erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。 | |
erase(elm); //删除为elm的值 | |||||
map/multimap | size() | find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end(); | insert(elem); //在容器中插入元素。 | erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。 | |
erase(key); //删除容器中值为key的元素。 |
int find(const string& str, int pos = 0) const;
//查找s第一次出现位置,从pos开始查找
int rfind(const string& str, int pos = npos) const;
//查找str最后一次位置,从pos开始查找
erase(pos);
//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(key);
//删除容器中值为key的元素。
insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
front();
//返回第一个元素。
back();
//返回最后一个元素。
remove(elem);//删除容器中所有与elem值匹配的元素。
string容器
查找和替换
int find(const string& str, int pos = 0) const;
//查找str第一次出现位置,从pos开始查找int rfind(const string& str, int pos = npos) const;
//查找str最后一次位置,从pos开始查找string& replace(int pos, int n, const string& str);
//替换从pos开始n个字符为字符串str
比较
- 按照字典顺序比较:使用
<
、<=
、>
、>=
运算符进行比较,以确定两个字符串的字典顺序关系。 - 按照字符数比较:使用
size()
或length()
函数获取字符串的长度,然后比较长度以确定哪个字符串包含更多字符。 - 按照内容比较:使用
compare()
函数来直接比较两个字符串的内容。此函数返回一个整数,表示两个字符串的相对大小关系。
插入和删除
string& insert(int pos, const char* s);
//插入字符串string& insert(int pos, const string& str);
//插入字符串string& insert(int pos, int n, char c);
//在指定位置插入n个字符cstring& erase(int pos, int n = npos);
//删除从Pos开始的n个字符
子串
string substr(int pos = 0, int n = npos) const;
//返回由pos开始的n个字符组成的字符串
和char数组的相互转化
- char数组转string
char charArray[] = "Hello";
std::string str = charArray; // 使用构造函数
// 或者
std::string str2;
str2 = charArray; // 使用赋值运算符
- string转char数组
std::string str = "World";
const char* charArray = str.c_str();
和数值类型的相互转化
-
string转化为数值
stoX(string s)
X为对应的类型缩写,如double为d,int为i,longlong为ll
-
数值类型转化为string
string s = to_string(数值)
vector容器
单端数组,类似于Java中list
插入和删除
push_back(ele);
//尾部插入元素elepop_back();
//删除最后一个元素insert(const_iterator pos, ele);
//迭代器指向位置pos插入元素eleinsert(const_iterator pos, int count,ele);
//迭代器指向位置pos插入count个元素eleerase(const_iterator pos);
//删除迭代器指向的元素erase(const_iterator start, const_iterator end);
//删除迭代器从start到end之间的元素- 假如要删除第i个元素,i为int类型,只需要
vec.erase(vec.begin() + i);
即可
- 假如要删除第i个元素,i为int类型,只需要
clear();
//删除容器中所有元素
数据存取
at(int idx);
//返回索引idx所指的数据operator[];
//返回索引idx所指的数据front();
//返回容器中第一个数据元素back();
//返回容器中最后一个数据元素
deque容器
双端数组
push_back(elem);
//在容器尾部添加一个数据push_front(elem);
//在容器头部插入一个数据pop_back();
//删除容器最后一个数据pop_front();
//删除容器第一个数据
指定位置操作:
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位置的数据,返回下一个数据的位置。
其他部分和vector一致
stack容器
栈容器
pop()
方法没有返回值。不会返回删除的元素,如果想要获取删除的元素,要先使用top()
再使用pop()
构造函数:
stack<T> stk;
//stack采用模板类实现, stack对象的默认构造形式stack(const stack &stk);
//拷贝构造函数
赋值操作:
stack& operator=(const stack &stk);
//重载等号操作符
数据存取:
push(elem);
//向栈顶添加元素pop();
//从栈顶移除第一个元素top();
//返回栈顶元素
大小操作:
empty();
//判断堆栈是否为空size();
//返回栈的大小
queue容器
队列容器
构造函数:
queue<T> que;
//queue采用模板类实现,queue对象的默认构造形式queue(const queue &que);
//拷贝构造函数
赋值操作:
queue& operator=(const queue &que);
//重载等号操作符
数据存取:
push(elem);
//往队尾添加元素pop();
//从队头移除第一个元素back();
//返回最后一个元素front();
//返回第一个元素
大小操作:
empty();
//判断堆栈是否为空size();
//返回栈的大小
排序
bool myCompare(pair<string,int>&p1,pair<string,int>&p2){
if (p1.second<p2.second){
return false;
}else if (p1.second>p2.second){
return true;
}else{
if(p1.first.compare(p2.first)<0)return true;
else return false;
}
}
- 自己写两个形参
- 返回true代表p1放在p2的前面(和Java的相反)
list容器
链表容器
插入和删除
push_back(elem);
//在容器尾部加入一个元素pop_back();
//删除容器中最后一个元素push_front(elem);
//在容器开头插入一个元素pop_front();
//从容器开头移除第一个元素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位置的数据,返回下一个数据的位置。remove(elem);
//删除容器中所有与elem值匹配的元素。
反转和排序
reverse();
//反转链表sort();
//链表排序
set/multiset容器
所有容器都会在插入时自动被排序
set和multiset区别:
- set不允许容器中有重复的元素
- multiset允许容器中有重复的元素
advance()
函数
set和map不支持随机访问,所以他们对应的迭代器不能随意的加减,只能一个一个加
但是可以通过advance函数实现前进多步的操作
std::advance(it, 2); // 将迭代器前进两步
直接把这个迭代器往前移动,没有返回值
pair对组
pair<type, type> p ( value1, value2 );
pair<type, type> p = make_pair( value1, value2 );
map/ multimap容器
- map中所有元素都是pair
- pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
- 所有元素都会根据元素的键值自动排序
map和multimap区别:
- map不允许容器中有重复key值元素
- multimap允许容器中有重复key值元素
算法
遍历算法
//第一种遍历方式:
while (pBegin != pEnd) {
cout << *pBegin << endl;
pBegin++;
}
//第二种遍历方式:
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
cout << *it << endl;
}
//可以使用auto来代替,他会自动识别迭代器的类型
cout << endl;
//第三种遍历方式:
//使用STL提供标准遍历算法 头文件 algorithm
for_each(v.begin(), v.end(), MyPrint);
}
遍历过程中删除元素
for(auto i=vector.begin();i!=vector.end();i++){
erase(i);
}
这样会发生指针异常,把这个数据删除了,再+1就不一定是vector中对应的下一个元素了
for(auto i=vector.begin();i!=vector.end();){
int j=i++;
erase(i);
i=j;
}
即便是这样也不行
正确方法:
for(auto i=vector.begin();i!=vector.end();){
i=erase(i);
}
sort算法
-
sort(iterator beg, iterator end, _Pred);
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
// beg 开始迭代器
// end 结束迭代器
// _Pred 谓词,自己写的一个bool函数