C++算法刷题常用库函数

常用库:

#include
#include
#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() 类似:

  • 如果 pos 越界,会抛出异常;
  • 如果 len 越界,会提取从 pos 到字符串结尾处的所有字符。

②字符串查找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()

④不太常用的inserterase

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():创建一个空vector
  • vector(int nSize):创建一个vector,元素个数为nSize
  • vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
  • vector(const vector&):复制构造函数
  • vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中

②增加元素

  • void push_back(const T& x):向量尾部增加一个元素X
  • iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
  • iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
  • iterator 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:存储键值对 类型的元素,其中各个键值对键的值不允许重复,且该容器中存储的键值对是无序的。与map的区别在于,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"<

你可能感兴趣的:(c++,算法,蓝桥杯)