• c++语法学习总结


    一. vector相关操作
    vector() 的最大、最小值,及其对应下标
    例 a[]={1,2,3,4,5,6};

    最大值:int maxValue = *max_element(a,a+6); 

    最小值:int minValue = *min_element(a,a+6);

    例 vector v;

    最大值下标:int maxPosition = max_element(v.begin(),v.end()) - v.begin(); 

    最小值下标:int minPosition = min_element(v.begin(),v.end()) - v.begin();

    vector的大小:
    vector tmp;
    tmp.size();
    tmp.capacity();

    vector的第一个元素:
    tmp.front();

    vector的最后一个元素:
    tmp.back();


    判断vector是否为空:
    tmp.empty();

    删除系列:
    //清空元素并回收空间
    vector tmp;
    vector().swap(tmp);

    tmp.swap(vector());

    //清空元素,但不回收空间
    tmp.clear();


    //清空vector中的其中一个元素
    vector::iterator it;
    for (it = vecnum.begin(); it != vecnum.end(); )
    {
        //注意使用erase()方法时,迭代不要随意的++
        it = vecnum.erase(it);
    }

    删除 [begin,end)区间元素
    tmp.erase(begin, end);

    vector元素翻转
    需要头文件#include
    reverse(vec.begin(),vec.end());

    删除vector中重复元素:
    vector a = {1, 4, 4, 3, 2, 4, 2};
    sort(a.begin(), a.end());
    auto it = unique(a.begin(), a.end());
    a.erase(it, a.end());


    将一个容器中的内容追加到另一个容器的后面
    std::vector v1, v2 ;
    v1.insert(v1.end(), v2.begin(), v2.end());


    swap 函数 交换两个值
    vector& nums;
    swap(nums[i], nums[j]);

    vector和set的互相转化
        vector vec;
        vec = { 1, 2, 3, 4, 8, 9, 3, 2, 1, 0, 4, 8 };
        set st(vec.begin(), vec.end());
        vec.assign(st.begin(), st.end());
        
        
    vector 求交集和并集
    vector v1 = {1,2,3,4,5,6};
    vector v2 = {3,4,5,6,7,8};
    sort(v1.begin(), v1.end());
    sort(v2.begin(), v2.end());
    vector v;
    set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(v)); //求交集
    vector vv;
    set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(vv)); //求并集

    二. string 相关
    s_str从k开始的子字符串
    string sub_str = s_str.substr(k);

    从 s 中找 sub_str
    if (s.find(sub_str) == string::npos) 找不到

    string 找到字符串中的第一个出现“1”的位置
    if (k = s_str.find_first_of("1")) != string::npos)

    判断是否是数字
    char a;
    if (isdigit(a))

    string转换int long等
    string str;
    int i = atoi(str.c_str()); // c
    int i = std::stoi(str);  // c++

    stol(long), stof(float), stod(double)

    去掉string的最后一位字符
    string res;
    res.pop_back();


    大写字符转换为小写字符
    tolower(char ch);

    比较两个字符串是否相等
    string s1, s2;
    if ((s1.compare(s2)) == 0)
    当s1 < s2时,返回为负数(-1);
    当s1 == s2时,返回值= 0;
    当s1 > s2时,返回正数(1)。

    int转换成string
    to_string
    std::string to_string(int value); (1) (C++11起)
    std::string to_string(long value); (2) (C++11起)
    std::string to_string(long long value); (3) (C++11起)
    std::string to_string(unsigned value); (4) (C++11起)
    std::string to_string(unsigned long value); (5) (C++11起)
    std::string to_string(unsigned long long value); (6) (C++11起)
    std::string to_string(float value); (7) (C++11起)
    std::string to_string(double value); (8) (C++11起)
    std::string to_string(long double value); (9) (C++11起)
    三. map
    删除一个节点
    auto iter = mapTest.find(key);  
    mapTest.erase(iter);


    map dict;
    map::iterator iter;
    // 插入方式
    dict.insert(pair("apple", 1));
    dict.insert(map::value_type("orange", 2));
    dict["purple"] = 3;

    // 遍历
    for (iter = dict.begin(); iter != dict.end(); iter++) {
        cout << iter->first << iter->second << endl;
    }

    if ((iter = dict.find("sdfas")) != dict.end()) {}

    // 查找
    if (dict.count("fawsef") == 0) {}

    iter = dict.lower_bound("buoluo"); //返回一个迭代器,指向键值>=key的第一个元素
    cout << iter->first;
    iter = dict.upper_bound("buoluo"); //返回一个迭代器,指向键值>key的第一个元素
    cout << iter->first;

    四、 stack
    top():返回一个栈顶元素的引用,类型为 T&。如果栈为空,返回值未定义。
    push(const T& obj):可以将对象副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。
    push(T&& obj):
    pop():
    size():返回栈中元素的个数。
    empty():在栈中没有元素的情况下返回 true。
    emplace():用传入的参数调用构造函数,在栈顶生成对象。
    swap(stack & other_stack):


    五、数字和字符的一些操作
    ::min(minV, x);  // 取最小值

    answer += max(0, oper);  // 0和oper中的最大值

    算出len的平方根
    sqrt(len)

    tmp的n次方
    int ans = pow(tmp, n);


    将整数转成二进制
    int i = 10;
    std::bitset<32> tmp(i);

      std::bitset<16> foo;  //16是长度
      std::bitset<16> bar (0xfa2);
      std::bitset<16> baz (std::string("0101111001"));

      std::cout << "foo: " << foo << '\n';
      std::cout << "bar: " << bar << '\n';
      std::cout << "baz: " << baz << '\n';
      
    foo: 0000000000000000
    bar: 0000111110100010
    baz: 0000000101111001  

    foo.to_string() 返回它转换为string的结果


    将二进制转换成十进制
    std::bitset<10> ("010101");
    int a = bit.to_ullong();
    cout << a;
    输出为21

    string out= "0101";
    int x = stoi(out, nullptr, 2);
    cout << x << endl;
    输出5


    string binaryString = "11111111111111111111111110000000"; // 128
    int retTmp = 0;
    for (int i = 0; i < binaryString.length(); i++) {
        retTmp += (binaryString[i] - '0') * pow(2, binaryString.length() -i -1);
    }


    将十进制转换成16进制数
    #include
    #include
    string dec2hex(int i)
    {
        stringstream ioss;
        string sTmp;
        //以8位宽度显示,不够补0,16进制以大写输出,hex 也可写为 setbase(16)
        ioss << setfill('0') << setw(8) << setiosflags(ios::uppercase) << hex << i; 
        //ioss << setiosflags(ios::lowercase) << hex << i; //小写
        ioss >> sTmp;
        return sTmp;
    }


    isalpha()用来判断一个字符是否为字母,如果是字符则返回非零,否则返回零。
    isdigit()用来判断一个字符是否为数字
    isalnum()用来判断一个字符是否为数字或者字母,也就是说判断一个字符是否属于a~z||A~Z||0~9
    cout< cout< cout< islower()用来判断一个字符是否为小写字母,也就是是否属于a~z
    isupper()和islower相反,用来判断一个字符是否为大写字母
    tolower()函数是把字符串都转化为小写字母
    toupper()函数是把字符串都转化为小写字母


    六、deque  与vector不同的是收尾都开放
    front()    返回第一个元素的引用。
    back()    返回最后一个元素的引用。
    assign()    用新元素替换原有内容。
    push_back()    在序列的尾部添加一个元素。
    push_front()    在序列的头部添加一个元素。
    pop_back()    移除容器尾部的元素。
    pop_front()    移除容器头部的元素。

    七、queue 
    和 stack 有一些成员函数相似,但在一些情况下,工作方式有些不同:
    front():
    back():
    push(const T& obj):
    push(T&& obj):
    pop():删除 queue 中的第一个元素。
    size():返回 queue 中元素的个数。
    empty():如果 queue 中没有元素的话,返回 true。
    emplace():用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
    swap(queue &other_q):

    八、 一些计算函数
    lower_bound()、upper_bound()、equal_range() 以及 binary_search() 
    这 4 个查找函数,它们的底层实现采用的都是二分查找的方式。
    int a[5] = { 1,2,3,4,5 };
    int *p = lower_bound(a, a + 5, 3);  // 从 a 数组中找到第一个不小于 3 的元素
    此时: *p = 3 

    九、语法学习总结
    多态:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。
    如果对象类型是派生类,就调用派生类的函数;
    如果对象类型是基类,就调用基类的函数。

    十、常用算法
    滑窗
        while ((left < size) && (right < size)) {
            int ans = v[right] - v[left];
            if (ans == gap) {
                answer++;
                right++;
            }
            
            if (ans < gap) {
                right++;
            }
            
            if (ans > gap) {
                left++;
            }
            
            if (left == right) {
                right++;
            }
        }
        
    二维数组比较大小:按列从小到大排,如果第一列相等,就按第二列的从大到小排
    1 2
    3 4
    2 10
    2 3  
    变成
    1 2 
    2 3 
    2 10 
    3 4  
    static bool cmp(vector &a, vector &b)
    {
        if (a[0] != b[0]) {
            return a[0] < b[0];
        } else {
            return a[1] < b[1];
        }
    }

    二维数组的遍历
    vector> matrixTmp(matrix);
    int row = matrixTmp.size();
    int col = matrixTmp[0].size();
    cout << row << " " <<  col << endl;
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            //
        }
        //
    }

    for (auto &i : matrix) {
        for (auto &j : i) {
            cout << j << " ";
        }
        cout<< endl;
    }

    岛屿问题模板
    class Solution {
    public:
        int dfs(vector>& grid, int i, int j) {
            // 递归中,写出结束条件,例如
            if (i < 0 || j < 0 || i >= grid.size() || j >= grid[0].size() || grid[i][j] == 0) {
                return 0;
            }
            // 定义两个数组,用于访问当前节点的上下左右的四个节点,进行递归调用
            int di[4] = {-1,0,1,0};
            int dj[4] = {0,1,0,-1};
            // 遍历临近四个节点,进行递归调用
            for (int index = 0; index < 4; ++index) {
                int next_i = i + di[index];
                int next_j = j + dj[index];
                // 此处根据题目具体需求进行操作,这里只是给出一个示例
                dfs(grid, next_i,next_j);
            }

            return xxx;
        } 

        int numIslands(vector>& grid) {
            // 遍历每个节点,每个节点都调用 dfs,从 dfs 中获取想要的结果
            for (int i = 0; i < grid.size(); ++i) {
                for (int j = 0; j < grid[0].size(); ++j) {
                    dfs(grid, i, j); 
                }
            }
            return xxx;
        }
    };

  • 相关阅读:
    矩阵问题(宏观调度)
    Speedoffice(word)如何设置文字高亮显示
    IM即时通讯开发iOS多设备字体适配方案
    Cesium 展示——设置图层顺序 ImageryLayer
    java计算机毕业设计高速收费系统后台源码+数据库+系统+lw文档+mybatis+运行部署
    Docker 编译 Go 项目
    揭秘光耦合器继电器:了解其功能和应用
    微软开源 windows-drivers-rs,用 Rust 开发 Windows 驱动程序
    【附源码】计算机毕业设计SSM特大城市地铁站卫生防疫系统
    今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 4月25日,星期四
  • 原文地址:https://blog.csdn.net/yanyuanyaun77/article/details/131092243