常用库:
#include
#include
#include
#include
#include
#include
#include
1.
见:牛客网输入输出汇总
2.
①排序题,配合vector使用sort函数
#include // std::cout
#include // std::sort
#include // std::vector
//以普通函数的方式实现自定义排序规则
bool mycomp(int i, int j) {
return (i < j);
}
//以函数对象的方式实现自定义排序规则
class mycomp2 {
public:
bool operator() (int i, int j) {
return (i < j);
}
};
int main() {
std::vector myvector{ 32, 71, 12, 45, 26, 80, 53, 33 };
//调用第一种语法格式,对 32、71、12、45 进行排序
std::sort(myvector.begin(), myvector.begin() + 4); //(12 32 45 71) 26 80 53 33
//调用第二种语法格式,利用STL标准库提供的其它比较规则(比如 greater)进行排序
std::sort(myvector.begin(), myvector.begin() + 4, std::greater()); //(71 45 32 12) 26 80 53 33
//调用第二种语法格式,通过自定义比较规则进行排序
std::sort(myvector.begin(), myvector.end(), mycomp2());//12 26 32 33 45 53 71 80
//输出 myvector 容器中的元素
for (std::vector::iterator it = myvector.begin(); it != myvector.end(); ++it) {
std::cout << *it << ' ';
}
return 0;
}
时间复杂度为N*log2N
(其中 N 为指定区域 [first, last) 中 last 和 first 的距离)
②find
()函数:模板函数,在指定范围内查找和目标值相等的第一个元素
方法 InputIterator find (InputIterator first, InputIterator last, const T& val);
该函数会返回一个输入迭代器,当 find() 函数查找成功时,其指向的是在 [first, last) 区域内查找到的第一个目标元素;如果查找失败,则该迭代器的指向和 last 相同。
#include // std::cout
#include // std::find
#include // std::vector
using namespace std;
int main() {
//find() 函数作用于普通数组
char stl[] =" ";
//调用 find() 查找第一个字符 'c'
char * p = find(stl, stl + strlen(stl), 'c');
//判断是否查找成功
if (p != stl + strlen(stl)) {
cout << p << endl;
}
//find() 函数作用于容器
std::vector myvector{ 10,20,30,40,50 };
std::vector::iterator it;
it = find(myvector.begin(), myvector.end(), 30);
if (it != myvector.end())
cout << "查找成功:" << *it;
else
cout << "查找失败";
return 0;
}
值得一提的是,find() 函数的底层实现,其实就是用==
运算符将 val 和 [first, last) 区域内的元素逐个进行比对。这也就意味着,[first, last) 区域内的元素必须支持==
运算符。
③二分查找,没有用过,但这里补充一下
bool binary_search (ForwardIterator first, ForwardIterator last, const T& val);
该函数会返回一个 bool 类型值,如果 binary_search() 函数在 [first, last) 区域内成功找到和 val 相等的元素,则返回 true;反之则返回 false。
#include // std::cout
#include // std::binary_search
#include // std::vector
using namespace std;
//以普通函数的方式定义查找规则
bool mycomp(int i, int j) { return i > j; }
//以函数对象的形式定义查找规则
class mycomp2 {
public:
bool operator()(const int& i, const int& j) {
return i > j;
}
};
int main() {
int a[7] = { 1,2,3,4,5,6,7 };
//从 a 数组中查找元素 4
bool haselem = binary_search(a, a + 9, 4);
cout << "haselem:" << haselem << endl;//1
vectormyvector{ 4,5,3,1,2 };
//从 myvector 容器查找元素 3
bool haselem2 = binary_search(myvector.begin(), myvector.end(), 3, mycomp2());
cout << "haselem2:" << haselem2;//1
return 0;
}
④reverse
翻转元素
3.
一般用在字符串处理的问题中,这里的函数容易和其他语言发生混淆,因此需要好好记忆和整理。
①提取子串substr()
string substr (size_t pos = 0, size_t len = npos) const;
string方法,返回string类型。
#include
#include
using namespace std;
int main(){
string s1 = "first second third";
string s2;
s2 = s1.substr(6, 6);//从pos=6开始,返回长度为6的子串
cout<< s1 <
系统对 substr() 参数的处理和 erase() 类似:
②字符串查找find()
:可以查找字符,也可以查找字符串
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
#include
#include
using namespace std;
int main(){
string s1 = "first second third";
string s2 = "second";
int index = s1.find(s2,5);//从第5位开始查找s2字符串,返回s2在s1中的起始位置
if(index < s1.length())
cout<<"Found at index : "<< index <
③转变为C风格字符串c_str()
④不太常用的insert
和erase
insert
#include
#include
using namespace std;
int main(){
string s1, s2, s3;
s1 = s2 = "1234567890";
s3 = "aaa";
s1.insert(5, s3);//从下标5开始插入s3
cout<< s1 <
erase
#include
#include
using namespace std;
int main(){
string s1, s2, s3;
s1 = s2 = s3 = "1234567890";
s2.erase(5);//删除下标5后所有字符
s3.erase(5, 3);//删除下标5后,长度为3这一段子串
cout<< s1 <
⑤split方法分割字符串,在C++里没有!这里借助istringstream和getline实现
vector stringSplit(const string& str, char delim) {
istringstream iss(str);
string item;
vector elems;
while (getline(ss, item, delim)) {
if (!item.empty()) {
elems.push_back(item);
}
}
return elems;
}
4.
这里列出常用操作,来自W3CSchool
①构造函数
vector()
:创建一个空vectorvector(int nSize)
:创建一个vector,元素个数为nSizevector(int nSize,const t& t)
:创建一个vector,元素个数为nSize,且值均为tvector(const vector&)
:复制构造函数vector(begin,end)
:复制[begin,end)区间内另一个数组的元素到vector中②增加元素
void push_back(const T& x)
:向量尾部增加一个元素Xiterator insert(iterator it,const T& x)
:向量中迭代器指向元素前增加一个元素xiterator insert(iterator it,int n,const T& x)
:向量中迭代器指向元素前增加n个相同的元素xiterator insert(iterator it,const_iterator first,const_iterator last)
:向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据③删除元素
iterator erase(iterator it)
:删除向量中迭代器指向元素iterator erase(iterator first,iterator last)
:删除向量中[first,last)中元素void pop_back()
:删除向量中最后一个元素void clear()
:清空向量中所有元素④查找元素
reference at(int pos)
:返回pos位置元素的引用reference front()
:返回首元素的引用reference back()
:返回尾元素的引用iterator begin()
:返回向量头指针,指向第一个元素iterator end()
:返回向量尾指针,指向向量最后一个元素的下一个位置reverse_iterator rbegin()
:反向迭代器,指向最后一个元素reverse_iterator rend()
:反向迭代器,指向第一个元素之前的位置⑤是否为空
bool empty() const
:判断向量是否为空,若为空,则向量中无元素⑥大小
int size() const
:返回向量中元素的个数int capacity() const
:返回当前向量所能容纳的最大元素值int max_size() const
:返回最大可允许的 vector 元素数量值5.
一般用在二叉树,或者图的题目中,比较常用的操作是取栈顶、取队尾、出栈出队、入栈入队,能够区分操作名即可。
stack myStack;
queue myQueue;
//元素添加
myStack.push(1);
myQueue.push(1);
//元素个数
int n1 = myStack.size();
int n2 = myQueue.size();
//元素访问
int x = myStack.top();
int y = myQueue.front();
int y_last = myQueue.back();
//元素删除
myStack.pop();
myQueue.pop();
//是否为空
bool isStackEmpty = myStack.empty();
bool isQueueEmpty = myQueue.empty();
6.
①哈希
纯int或char类型,数值限定在某一范围的,可以用数组解决,其他情况下可以使用unordered_map
unordered_map:存储键值对
以下是基本使用:
#include
#include
#include
using namespace std;
int main()
{
//创建空 umap 容器
unordered_map umap;
//向 umap 容器添加新键值对
umap.emplace("Python教程", " ");
umap.emplace("Java教程", " ");
umap.emplace("Linux教程", " ");
//输出 umap 存储键值对的数量
cout << "umap size = " << umap.size() << endl;
//使用迭代器输出 umap 容器存储的所有键值对
for (auto iter = umap.begin(); iter != umap.end(); ++iter) {
cout << iter->first << " " << iter->second << endl;
}
return 0;
}
②去重
一般需要去重时,会使用set。当数值限定在某一范围内,依旧可以尝试通过数组解决。
unordered_set:直接存储数据元素本身。另外,该容器存储的元素不能重复,且容器内部存储的元素也是无序的。与set的区别在于,set容器会内部排序。
以下是基本使用:
#include
#include
#include
using namespace std;
int main()
{
//创建一个空的unordered_set容器
std::unordered_set uset;
//给 uset 容器添加数据
uset.emplace(" ");
uset.emplace(" ");
uset.emplace(" ");
//查看当前 uset 容器存储元素的个数
cout << "uset size = " << uset.size() << endl;
//遍历输出 uset 容器存储的所有元素
for (auto iter = uset.begin(); iter != uset.end(); ++iter) {
cout << *iter << endl;
}
return 0;
}
③map的基本使用
//map-插入键值对
map < int , string > mapPerson;
mapPerson.insert(pair < int,string > (1,"Jim"));//通过insert
mapPerson[3] = "Jerry";//直接插入
//map-查找元素(根据key的查找)
map ::iterator l_it;
l_it = maplive.find(112);
if(l_it == maplive.end())
cout<<"we do not find 112"<