首页 > 编程语言 >C++刷题tricks整理

C++刷题tricks整理

时间:2024-10-22 23:31:27浏览次数:7  
标签:std begin set end int tricks C++ hash 刷题

是自己做题中整理的常用C++操作,此为存档。

STL容器

容器适配器,STL里面的vector/array/deque/set/map/unordered_set可以直接使用==比较是否相等:

vector<int> a;
deque<int> a;
map<int, string> a;
unordered_map<int, string> a;
set<int> a;
unordered_set<int> a;
forward_list<int> a; // 单向链表
list<int> a; // 双向链表
priority_queue<int> a; // 最大堆
stack<int> a; // 栈模拟
queue<int> a; // 队列模拟

unordererd_set的查找(C++20):

unordered_set<int> hash;
bool result = hash.contains(a);

priority_queue自定义比较函数:

std::less<int>()
std::greater<int>()
[](int a, int b)(return a<b;);

unordered_set自定义hash函数:

#include <iostream>
#include <unordered_set>
#include <string>
#include <utility>  // for std::pair
    
// 自定义哈希函数
    struct pair_hash {
        template <class T1, class T2>
        std::size_t operator() (const std::pair<T1, T2>& p) const {
            auto hash1 = std::hash<T1>{}(p.first);
                auto hash2 = std::hash<T2>{}(p.second);
            return hash1 ^ hash2; // 组合两个哈希值,使用XOR
        }
    };
    
    int main() {
        // 使用自定义哈希函数
        std::unordered_set<std::pair<std::string, std::string>, pair_hash> dp;
    
        // 插入一些元素
        dp.insert({"hello", "world"});
        dp.insert({"foo", "bar"});return 0;
    }

泛型算法

求最大最小:

std::min_element(a.begin(), a.end());
std::max_element(a.begin(), a.end());

二分搜索(要求有序):

it = std::upper_bound(a.begin(), a.end(), val); // *it > val
it = std::lower_bound(a.begin(), a.end(), val); //*it >= Val

  * 如果找不到的话,会返回a.end()
  * 如果使用的是std::binary_search的话,只能返回一个bool值,并且还要提前保证数组有序
  * 如果是想求等于某元素的情况,可以用:

// 从开始位置到i位置=k的结果
upper_bound(nums.begin(), nums.begin()+i+1, k) - lower_bound(nums.begin(), nums.begin()+i+1, k);

使用<numeric>的accumulate迭代器求和:

int sum = stdaccumulate(vec.begin(), vec.end(), 0);

使用fill函数填充:

std::fill(a.begin(), a.end(), 1);

在STL的泛型函数中使用谓词:

int evenCount = std::count_if(vec.begin(), vec.end(), [](int n) {return n % 2 == 0;});
std::sort(vec.begin(), vec.end(), compare);  

使用STL里面的copy操作(from origin to destination),注意copy的第二个参数是尾后迭代器

字符串

字符串切片

sub = str.substr(7, 5); // start at 7 length 5
sub = str.substr(5); // start at 5 length to the end

与c风格字符串的转化

string str = std::to_string(pi); // int, float to string
const char* cstr = str.c_str();

读取字符流并提取单个单词

    std::vector<std::string> splitString(const std::string& str){
        std::vector<std::string> result;
        std::stringstream ss(str);
        std::string word;
        
        // 使用流提取运算符 (>>) 从字符串流中逐个提取单词
        while (ss >> word) {
            result.push_back(word);
        }
        
        return result;
    }

 

标签:std,begin,set,end,int,tricks,C++,hash,刷题
From: https://www.cnblogs.com/hesun/p/18494163

相关文章

  • 马拉车算法(C/C++)
    #1024程序员节|征文#马拉车算法(Manacher'sAlgorithm)是一种用于在字符串中查找最长回文子串的线性时间复杂度算法。该算法由UdiManacher在1980年代提出,因此得名。它的核心思想是利用已知的回文信息来减少不必要的比较,从而提高效率。算法步骤预处理字符串:为了处理奇数......
  • C++入门Day5 ~ 6:简单变量 & 数据类型 part 1 <8000字长文带你初步理解数据类型>
    这是我在学习中的一个小问题,希望对你也有所帮助:        问:数据类型和简单变量属于oop的基本概念吗?        答:不是!数据类型和简单变量本身并不属于面向对象编程(OOP)的基本概念,但它们是编程中的基础概念,面向对象编程会基于这些基础概念来构建更复杂的结构。......
  • C++基础——寻找水仙花数
    C++基础——寻找水仙花数一、水仙花数1.什么是水仙花数2.编译思路二、头文件三、主文件四、整体代码五、运行结果一、水仙花数1.什么是水仙花数原理:我们先理解什么是水仙花数(NarcissisticNumber),所谓的水仙花数是指一个整数的各位数字的立方和等于它本身。例如153......
  • 【C++】踏上C++学习之旅(三):“我“ 与 “引用“ 的浪漫邂逅
    文章目录前言1."引用"的概念1.1"引用"的语法2."引用"的特性3."引用"的使用场景3.1"引用"做参数3.2"引用"做返回值3.2.1"引用"做返回值时需要注意的点4.常引用5."引用"在底层的实现6."引用"和"指针"的不同点(面试常考)前言本文会着重的讲解&q......
  • 【C++-NOIP篇-4】 [NOIP2007 普及组] 纪念品分组
    文章目录[NOIP2007普及组]纪念品分组题目背景题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示题目思路完整Code[NOIP2007普及组]纪念品分组题目背景NOIP2007普及组T2题目描述元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参......
  • 施磊c++基础8
    STL内容学习简介C++STL:standardtemplatelibarayvector容器底层数据结构:动态开辟的数组。每次以空间大的二倍扩容增加vec.push_back(20);末尾添加元素20—O(1)vec.insert(it,20);在it迭代器指向的位置插入元素20—O(n)删除vec.pop_back;末尾删除元素----......
  • 施磊c++基础7
    C++的四种类型转换c语言中提供的类型强转inta=(int)b;c++提供:const_cast:去掉常量属性的一个类型转换 int*p1=(int*)&a; int*p2=const_cast<int*>(&a);这两句是一样的,只不过使用第二种,可以保证类型转换是安全的,如果要转换成不符合的类型就会报错。static_......
  • 【C++指南】类和对象(四):类的默认成员函数——全面剖析 : 拷贝构造函数
     引言拷贝构造函数是C++中一个重要的特性,它允许一个对象通过另一个已创建好的同类型对象来初始化。了解拷贝构造函数的概念、作用、特点、规则、默认行为以及如何自定义实现,对于编写健壮和高效的C++程序至关重要。 C++类和对象系列文章,可点击下方链接阅读:【C++指南......
  • PMP--必刷题–解题–61-70
    文章目录4.整合管理--问题日志--61、[单选]一个软件交付项目开始遇到技术障碍,这个问题可能导致交付物延迟。技术服务团队一直在处理这个问题,但即使经过1周的维护,问题仍未解决。高级项目经理现在应该怎么做?62、[单选]客户要求项目经理提供项目状态报告。项目经理发送......
  • PMP--必刷题–解题–71-80
    文章目录4.整合管理--最终报告--工作绩效报告的示例包括状态报告和进展报告。71、[单选]当一个`项目结束`时,一个业务干系人向项目经理请求有关整体项目绩效的信息,以确定该计划的成功。项目经理应该怎么做,以向干系人提供相关信息?4.整合管理--6.实施整体变更控制--项目......