• 刷题用到的非常有用的函数c++(持续更新)


    在这里插入图片描述

    字符串处理类

    一、stoi()(将字符串转换为整数类型)

    在C++中,可以使用 std::stoi() 函数将字符串转换为整数类型。

    示例代码如下:

    #include 
    #include 
    
    int main() {
        std::string str = "12345";
        int num = std::stoi(str);
        std::cout << "The converted integer is: " << num << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果为:

    The converted integer is: 12345
    
    • 1

    std::stoi() 函数接受一个字符串作为参数,并尝试将其转换为整数类型。如果转换成功,则返回转换后的整数值;如果无法进行有效的转换,将抛出 std::invalid_argumentstd::out_of_range 异常。

    需要注意的是,如果字符串中包含除数字以外的字符,或者超出了整数类型的取值范围,那么转换将失败。在使用 std::stoi() 函数时,要确保输入的字符串符合期望的格式和范围,或者进行适当的异常处理。

    二、to_string()(将整数类型转换为字符串类型

    在C++中,可以使用 std::to_string() 函数将整数类型转换为字符串类型。

    示例代码如下:

    #include 
    #include 
    
    int main() {
        int num = 12345;
        std::string str = std::to_string(num);
        std::cout << "The converted string is: " << str << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果为:

    The converted string is: 12345
    
    • 1

    std::to_string() 函数接受一个整数作为参数,并返回对应的字符串表示。它将整数转换为相应的十进制字符串。

    需要注意的是,转换后的字符串对象是一个新的副本,原始的整数值并不受影响。

    另外,如果需要将其他类型的值转换为字符串,也可以借助字符串流(std::stringstream)和输出流操作符来实现。例如:

    #include 
    #include 
    #include 
    
    int main() {
        int num = 12345;
        std::stringstream ss;
        ss << num;
        std::string str = ss.str();
        std::cout << "The converted string is: " << str << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这种方法可用于将各种类型(如浮点数、布尔值等)转换为字符串。

    三、stringstream函数(将一个字符串按照指定的分隔符进行分词)

    stringstream 是 C++ 标准库中的一个类,它可以将字符串转换为流,从而可以方便地对字符串进行输入输出操作,如分词、格式化等

    通过 stringstream,我们可以将一个字符串按照指定的分隔符进行分词。具体使用方法如下:

    1. 首先需要包含头文件 :

      #include 
      
      • 1
    2. 然后创建一个 stringstream 对象,并将需要分词的字符串传入该对象的构造函数:

      std::stringstream ss("this is a string");
      
      • 1
    3. 使用 while 循环和 >> 运算符,从 stringstream 中逐个读取分词:

      std::string word;
      while (ss >> word) {
          // 处理分词
      }
      
      • 1
      • 2
      • 3
      • 4

      在此代码片段中,每次循环会从 stringstream 中读取一个单词(以空格为分隔符),并将其存储在变量 word 中。

      可以将 >> 运算符看作是一个提取器,它会从 stringstream 中读取下一个可用的值,并将其存储到变量中。当所有的值都被读取完毕时,>> 运算符会返回 false,此时循环会退出。

      可以使用 getline() 函数来按照指定的分隔符读取一整行数据,例如:

      std::string line;
      getline(ss, line, ','); // 以逗号为分隔符读取一整行数据
      
      • 1
      • 2

    如果你需要对字符串进行分词、格式化等操作,stringstream 可以是一个很好的工具。

    力扣题目:2512. 奖励最顶尖的 K 名学生
    解题代码:

    class Solution {
    public:
        vector<int> topStudents(vector<string>& positive_feedback, vector<string>& negative_feedback, vector<string>& report, vector<int>& student_id, int k) {
            map<std::string, int> words;
            for (const auto& word : positive_feedback) 
            {
                words[word] = 3;
            }
            for (const auto& word : negative_feedback) 
            {
                words[word] = -1;
            }
            vector<vector<int>> A;
            for (int i = 0; i < report.size(); i++) 
            {
                stringstream ss;
                string w;
                int score = 0;
                ss << report[i];
                while (ss >> w) 
                {
                    if (words.count(w)) 
                    {
                        score += words[w];
                    }
                }
                A.push_back({-score, student_id[i]});
            }
            sort(A.begin(), A.end());
            vector<int> top_k;
            for (int i = 0; i < k; i++) 
            {
                top_k.push_back(A[i][1]);
            }
            return top_k;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    4. substr( )

    substr是C++中的字符串函数,用于从一个字符串中提取子字符串。

    函数原型如下:

    string substr (size_t pos, size_t len) const;
    
    • 1

    参数:

    • pos:子字符串的起始位置。
    • len:要提取的字符数量。

    返回值:

    • 返回一个新的字符串,包含从原始字符串中提取的子字符串。

    示例用法:

    string str = "Hello, World!";
    string sub = str.substr(7, 5);
    
    cout << sub << endl; // 输出 "World"
    
    • 1
    • 2
    • 3
    • 4

    在上面的示例中,我们从字符串"Hello, World!“中提取了从索引位置7开始的5个字符,得到了子字符串"World”。

    哈希数组(树类)

    一、lower_bound(有序集合中寻找第一个不小于指定值的元素的迭代器)

    在使用 lower_bound 函数之前,需要确保集合是有序的。如果集合是无序的(unordered_set),则无法使用 lower_bound 函数。

    lower_bound 函数接受一个参数,表示要查找的值。它返回一个迭代器,指向集合中第一个不小于该值的元素。如果找到了符合条件的元素,则返回该元素的迭代器;如果没有找到,则返回指向集合中第一个大于该值的元素的迭代器,或者返回 end() 迭代器(表示未找到)。

    set 是一个基于红黑树实现的有序集合容器,它存储了一组唯一且按照升序排序的元素。由于是有序的,因此可以使用 lower_bound 函数来进行查找。

    lower_bound 函数接受一个参数,表示要查找的值。它返回一个迭代器,指向集合中第一个不小于该值的元素。如果找到了符合条件的元素,则返回该元素的迭代器;如果没有找到,则返回指向集合中第一个大于该值的元素的迭代器。

    例如,如果你想在有序集合 s 中查找第一个不小于 5 的元素:

    auto it = s.lower_bound(5);
    if (it != s.end()) {
        // 找到了符合条件的元素
        int value = *it;  // 获取找到的元素的值
        // 其他操作...
    } else {
        // 未找到符合条件的元素
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意,lower_bound 函数只适用于有序集合,并且返回的是一个迭代器,可以通过解引用 *it 来获取元素的值。

    lower_bound 的时间复杂度为 O(logN),其中 N 表示集合中的元素个数。它是一种高效的查找方法,在有序集合中定位元素位置非常有用。

    力扣题目:1488. 避免洪水泛滥
    解题代码:

    class Solution {
    public:
        vector<int> avoidFlood(vector<int>& rains) {
            int n = rains.size();
            vector<int> ans(n, 1);
            map<int, int> water;
            set<int>zero;
            for (int i = 0; i < n; ++i) 
            {
               if (rains[i] == 0)
               {
                   zero.insert(i);
                   continue;
               }
               if (water.count(rains[i]) != 0) 
               {
                    auto it = zero.lower_bound(water[rains[i]]);
                    if (it == zero.end()) return {};
                    ans[*it] = rains[i];
                    zero.erase(it);
                }
                water[rains[i]] = i;
                ans[i] = -1;
           }
           return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    异或运算符技巧

    一、两个相邻的奇偶数(如[0, 1][2, 3]…)

    int x = row[i];
    int y = x ^ 1;
    
    • 1
    • 2

    具体来说,因为夫妻之间的编号是成对出现的,且相邻的两个编号满足如下关系:

    • 如果一个人的编号是偶数,那么他的伴侣的编号就是比他大1的奇数;
    • 如果一个人的编号是奇数,那么他的伴侣的编号就是比他小1的偶数。

    因此,对于给定的编号x,可以通过将其与1进行异或操作(即x ^ 1)来得到其伴侣的编号y。

    题目链接:链接:765. 情侣牵手

    class Solution {
    public:
        int minSwapsCouples(vector<int>& row) {
            int ans = 0, n = row.size();
            for (int i = 0; i < n; i += 2) 
            {
                int x = row[i];
                int y = x ^ 1;
                if (row[i + 1] != y) 
                {
                    for (int j = i + 2; j < n; j++) 
                    {
                        if (row[j] == y) 
                        {
                            int temp = row[i + 1];
                            row[i + 1] = row[j];
                            row[j] = temp;
                            ans++;
                            break;
                        }
                    }
                }
            }
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    cv_bridge和opencv 记录
    自适应对话式团队构建,提升语言模型代理的复杂任务解决能力
    MuLogin浏览器如何在一台设备上安全登录和管理多个LinkedIn账户?
    2011年408真题复盘
    RTT 发散思维写点随笔录
    极值点偏移练习1
    从电商到超市,美团的零售之变
    【gzoj8.12综合三】银河摆渡【二分+DP】
    css flex 踩坑总结
    2023网络建设与运维模块三:服务搭建与运维
  • 原文地址:https://blog.csdn.net/m0_75215937/article/details/133782215