美文网首页
STL常用容器和算法

STL常用容器和算法

作者: 漫游之光 | 来源:发表于2018-12-21 15:13 被阅读0次

主要是方便查阅,每次都要去网上找感觉比较麻烦,作为笔记写在这里。这里是我在做算法题的时候,需要去查阅的STL中的容器和算法,所以,最常用的这里没有列举。

string

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main(int argc, char const *argv[])
{
    string s;
    // getline(cin,s); //读取一行,以换行作为分隔符
    // cin>>s; //读取一个字符串,以空格、换行作为分隔符
    int num = 12345678;
    s = to_string(num); //数字转字符串

    int p1 = s.find("3",0); //字符串查找
    int p2 = s.find('4',0);
    if(p1 != string::npos && p2 != string::npos){
        s = s.substr(p1,p2 - p1 + 1);
        cout<<s<<endl; //截取字符串
    }
    num = stod(s); //字符串转数字 num = 34

    /* 读取一个表达式中数字 */
    string expression = "7+3*4*5+2+4-3-1";
    istringstream iss(expression);
    ostringstream oss; 
    while(!iss.eof()){
        char c = iss.peek(); //查看第一个字符,但不读出
        // iss.putback(c); //可以将一个字符压回到输入流
        if(c >= '0' && c <= '9'){
            int tmp;
            iss>>tmp;
            oss<<tmp<<" ";
        }else{
            iss>>c;
        }
    }
    cout<<oss.str()<<endl;
    return 0;
}

正则表达式

遇到字符串的问题,特别是匹配的问题,可以先考虑能否用正则表达式处理。个人感觉,正则表达式算是一个处理字符串神器。

使用正则表达式需要使用头文件regex,其中,有以下常用组件。

  • regex 表示有一个正则表达式的类
  • regex_match 将一个字符序列与一个正则表达式匹配
  • regex_search 寻找第一个与正则表达式匹配的子序列
  • regex_replace 使用给定格式替换一个正则表达式
  • sregex_iterator 迭代器适配器,调用regex_search来遍历一个string中所匹配的子串
  • smath 容器类,保存在string中搜索的结果
#include <iostream>
#include <string>
#include <regex>
using namespace std;


int main(int argc, char const *argv[])
{
    /* 检查一个字符串是否为一个有效的ip地址 regex构造时可能会抛出异常*/
    regex ip("^((25[0-5]|2[0-4]\\d|[1]{1}\\d{1}\\d{1}|[1-9]{1}\\d{1}|\\d{1})($|(?!\\.$)\\.)){4}$");
    vector<string> v = {"127.0.0.1","127.0.1","256.0.0.0"};
    for(int i=0;i<v.size();i++){
        if(regex_match(v[i],ip)){
            cout<<v[i]<<" ";
        }
    }
    cout<<endl;

    /* 找出字符串中所有的数字 */
    string s = "abc123i2cd34jihle233";
    regex num("[0-9]+");
    sregex_iterator it(s.begin(),s.end(),num),end;
    for(;it != end;++it){
        cout<<it->str()<<" ";
    }
    cout<<endl;

     /* 找出字符串中的第一个数字 */
    smatch results;
    if(regex_search(s,results,num)){
        cout<<results.str()<<endl;
    }

    /* 去掉字符串中的数字 */
    string s1 = regex_replace(s,num,""); //这个函数还有更高级的用法
    cout<<s1<<endl;
    return 0;
}

vector

#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char const *argv[])
{
    vector<int> v;
    for(int i=0;i<10;i++){
        v.push_back(i);
        /* size:存储的数据的大小 capacity:分配空间的大小 */
        cout<<v.size()<<" "<<v.capacity()<<endl;
    }

    /* 可以利用vector的push_back和pop_back方法当做栈使用 */
    /* 在迭代中删除元素 */
    vector<int>::iterator it = v.begin();
    while(it != v.end()){
        if(*it % 2 == 1){
            it = v.erase(it);
        }else{
            ++it;
        }
    }

    for(int i=0;i<v.size();i++){
        cout<<v[i]<<" ";
    }
    cout<<endl;
    return 0;
}

queue、dequeue和priority_queue

#include <iostream>
#include <queue>
using namespace std;

struct cmp{
    bool operator()(int a,int b){
        return a < b;
    }
};

int main(int argc, char const *argv[])
{
    deque<int> deq;
    deq.push_front(2);
    deq.push_back(1);
    deq.pop_back();
    deq.pop_front();
    deq.front();
    deq.back();
    priority_queue<int,vector<int>,cmp> pq;
    pq.push(1);
    pq.pop();
    pq.top();
    return 0;
}

set和map

set和map在刷题的过程中,主要实现动态地查找和更新。个人感觉需要掌握的就是插入、删除,查找和更新。

#include <iostream>
#include <set>
#include <map>
using namespace std;

int main(int argc, char const *argv[])
{
    map<string,int> word;
    for(int i=0;i<10;i++){
        string s;
        char c = 'A' + i;
        s += c;
        word[s] = 1; //如果有,就赋值,没有,就插入新的记录
    }
    if(word.find("A") == word.end()){
        word.insert(make_pair("A",1)); // insert插入时,如果关键字在记录中,什么也不做
    }else{
        word["A"] ++;
    }
    word.erase("B");
    for(map<string,int>::iterator i = word.begin();i != word.end();++i){
        cout<<i->first<<" "<<i->second<<endl;
    }

    set<int> mark;
    for(int i=0;i<10;i++){
        mark.insert(i);
    }
    for(set<int>::iterator i = mark.begin();i != mark.end(); ){
        if(*i % 2 == 1){
            i = mark.erase(i);
        }else{
            i++;
        }
    }
    for(set<int>::iterator i = mark.begin();i != mark.end(); ++i){
        cout<<*i<<" ";
    }
    cout<<endl;
    return 0;
}

常用算法

lambd表达式

C++11支持lambd表达式,个人感觉写算法的时候,还是这个最好用。因为以前使用的是Java,对于不能创建一个匿名对象作为参数还是不习惯。现在C++也支持这种格式。

[capture list](parameter list)->return type {function body}

capture list表示要捕捉的局部变量。

排序和二分查找

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(int argc, char const *argv[])
{
    vector<int> v = {2,6,1,5,9,0,3,8,7,4};
    vector<int> v1 = {5,9};

    vector<int>::iterator i = find(v.begin(),v.end(),3); // 查找元素
    cout<< i - v.begin() <<endl;
    i = search(v.begin(),v.end(),v1.begin(),v1.end()); //查找子序列
    cout<< i - v.begin() <<endl;
    
    sort(v.begin(),v.end()); //还有一个稳定的排序stable_sort
    // lower_bound 返回第一个大于等于val的元素,不存在则返回end
    // upper_bound 返回第一个大于等于val的元素,不存在则返回end
    i = upper_bound(v.begin(),v.end(),30);
    cout<<v.end() - i<<endl;

    return 0;
}

相关文章

  • 标准模板库STL

    一、STL简介 STL实现了计算机科学领域里常用的基本数据结构和基本算法; STL主要包含了容器、算法、迭代器。 ...

  • 第二章 C++ STL 泛型编程 1

    一、STL 概述 STL——C++标准模板库,定义了常用的数据结构和算法。提供三种类型的组件:容器、迭代器和算法。...

  • STL常用容器和算法

    主要是方便查阅,每次都要去网上找感觉比较麻烦,作为笔记写在这里。这里是我在做算法题的时候,需要去查阅的STL中的容...

  • C++ STL是什么

    STL 组件主要包括容器,迭代器、算法和仿函数。STL 基本结构和 STL 组件对应。 STL 主要由迭代器、算法...

  • (Boolan) STL与泛型编程第四周笔记(上)

    1 STL组建(STL Components) 关键组建:容器,迭代器,算法 STL的基本观念就是将数据和操作分离...

  • 迭代器的概念

    STL的算法库和容器库是分离开来的,STL通过迭代器的概念实现了算法对容器的操作,因此可以认为迭代器是一种遍历容器...

  • (Boolan) STL与泛型编程第四周笔记(上)

    1 STL组建(STL Components)关键组建:容器,迭代器,算法STL的基本观念就是将数据和操作分离,数...

  • C++标准模板库

    STL包含了容器类(container)、迭代器(iterator)和算法(algorithm)三个部分 容器(C...

  • 2019-10-13 STL模板

    STL共有六大组件 1、容器 2、算法 3、迭代器 4、仿函数 6、适配器 STL容器的实现原理 STL来管理数据...

  • STL学习笔记之容器(二)

    vector和string 所有的STL容器都很有用,但是相比于其他容器,vector和string更常用。本章从...

网友评论

      本文标题:STL常用容器和算法

      本文链接:https://www.haomeiwen.com/subject/jgwukqtx.html