C++常用的刷题技巧

1、常用最值常量

    int min = INT_MIN; // -2147483648
    int max = INT_MAX; // 2147483647
    const int INF = 0X3F3F3F3F;  // 1061109567, 通常使用代替最大值,防止溢出

2、字符串判断函数

        char c = 65;
        char b = '4';
        char a = 'D';
        cout << std::isdigit(c) <<endl; //  0   判断C字符串是不是数字
        cout << std::isalpha(c) <<endl; //  1  判断C字符串是不是字母
        cout << std::isalnum(b) <<endl; //  4  判断C字符串是不是数字或者字母
        cout << std::islower(a) <<endl; //  0  判断C字符串是不是小写
        cout << std::isupper(a) <<endl; //  1 判断C字符串是不是大写

3、字符串和数值之间的转化

        int num = 100;
        string str = to_string(num); // 整型转化为字符产
        cout << str << endl; //100
        int number = stoi(str);  // 数字转化为整型 ,stol
        cout << number << endl; //100

4、迭代器的二分法

        vector<int> nums{
    
    1, 2, 34, 44, 56, 99};
        int k = lower_bound(nums.begin(), nums.end(), 56) - nums.begin(); // 4 第一个大于等于目标值的的迭代器的位置。
        cout << k << endl;
        int g = upper_bound(nums.begin(), nums.end(), 56) - nums.begin(); // 5 第一个大于目标值的的迭代器的位置。
        cout << g << endl;

5、字符串转小写

        string strTemp = "abcdEFGH";
        transform(strTemp.begin(), strTemp.end(), strTemp.begin(), ::tolower); 
        cout << strTemp << endl; // abcdefgh
        transform(strTemp.begin(), strTemp.end(), strTemp.begin(), ::toupper); 
        cout << strTemp << endl; // ABCDEFGH

6、小根堆

        priority_queue<pair<string,int>> pqGig;  //  大根堆
        for (int i = 0; i < 10; ++i) {
    
    
            // emplace() 和 insert() 都能完成向 vector 容器中插入新元素,那么谁的运行效率更高呢?答案是 emplace()
            pqGig.emplace(to_string(10 - i +100), i);
        }
        while (!pqGig.empty()){
    
    
            pair<string, int> temp = pqGig.top();
            cout << temp.first << ": " << temp.second <<endl;
            pqGig.pop();
        }
        priority_queue<int ,vector<int>, greater<int>> pqLitter; //  小根堆

7、快速初始化数组

        vector<string> tmpStr(7, ""); //数组长度为7,全部初始化为""
        vector<int> tmpInt(10, 0x3f3f3f3f);  //数组长度为10,全部初始化为1061109567
        cout << tmpStr.size() << endl;  // 7
        cout << tmpInt.size() << endl;  // 10
        for (int i = 0; i < tmpInt.size(); ++i) {
    
    
            cout << tmpInt[i] << endl;  // 1061109567
        }
        int tmp[10];
        memset(tmp, 0, sizeof tmp);  //  按字节初始化数组,元素为0
        memset(tmp, -1, sizeof tmp); //  按字节初始化数组,元素为-1
        memset(tmp, 0x3f, sizeof tmp);//  按字节初始化数组,元素为1061109567

8、C++ 11的特性

        auto p = 1;  // auto
        string *pre = nullptr; //nullptr替代NULL
        unordered_map<int, string> mp; //哈希表,内部无序map
        unordered_set<string> st; //无序集合

9、字符串分割

		string str1 = "word mine sd sd";
        stringstream strStream(str1);
        string tmp;
        while (strStream >> tmp){
    
          //   读入数据,赋值给tmp
            cout << tmp << endl;
        }

10、四舍五入保留小数

        char str[10];
        double num = 22.234334;
        sprintf(str, "%.2f", num);
        string s = str;
        cout << s << endl;

11、字符串按格式分割

        string aa = "110, 119, 120, 113";
        char strChar[1000];
        memcpy(strChar, aa.c_str(), strlen(aa.c_str()));
        int u, v, w, x;
        sscanf(strChar,"%d, %d, %d, %d", &u, &v, &w, &x);
        cout << u <<"-"<< v <<"-" << w <<"-" << x << endl;

12、相同字符的字符串

	string tempStr(12, 'b');

13、结构体排序

        struct node{
    
    
            int a, b;
            // 从小到大排序
            bool operator < (const node& node_)const{
    
    
                if(a != node_.a) return a < node_.a;
                return b < node_.b;
            }
        };
        int main(){
    
    
            vector<node> tt;
            tt.push_back({
    
    1,5});
            tt.push_back({
    
    2,3});
            sort(tt.begin(), tt.end());
            for(auto &node: tt){
    
    
                cout<<node.a<<" "<<node.b<<endl;
            }
            return 0;
        }

14、 二维数组按列排序

按照第一列排序,如果第一列相等按照第二列排序

	vector<vector<int>> v;
	sort(v.begin(),v.end(),[](vector<int>&v1,vector<int>&v2){
    
    if(v1[0] != v2[0])return v1[0]<v2[0];else return v1[1]<v2[1];});

15、reverse()函数

要包含头文件#include,该函数没有返回值。
如果是二维数组,按照行翻转,比如第一行翻转之后到最后一行。

	reverse[first,last);

16、 .,->的区别

实例和指针的区别。
A.B则A为对象或者结构体; 点号(.):左边必须为实体。
A->B则A为指针,->是成员提取,A->B是提取A中的成员B,A只能是指向类、结构、联合的指针; 箭头(->):左边必须为指针。

17、排序,同时保留原坐标

	sort(ids.begin(),ids.end(),[&](int i,int j){
    
    return nums2[i] < nums2[j];});

此时ids[0]就是原数组中最小数的坐标
或者是:

vector<pair<int,int>> v;
//第一个位置放数值,第二个位置放坐标
sort(v.begin(),v.end());

18、 function 函数的用法

std::function是一个通用的多态函数包装器,可以调用普通函数、Lambda函数、仿函数、bind对象、类的成员函数和指向数据成员的指针,function定义在名为function.h头文件中。是一个模板,在创建function实例时,必须指明类型,如:

#include <functional>
function<int(int,int)> func//表示接受两个int,返回一个int的可调用函数
function<int(int,int)> func = [&](int a,int b){
    
    };//可以等于某个匿名函数

使用function函数可以不需要将主函数中的参数传入,直接以引用的方式捕获就可以。

猜你喜欢

转载自blog.csdn.net/weixin_45717907/article/details/131154863