总结(取余,快速幂 , c++STL 库部分容器的使用)

这篇博客介绍了编程中的一些关键算法,如取余运算的优化方法,快速幂计算,阶乘取模以及大数取余。同时,详细讲解了C++STL库的几个重要组件,包括可变数组vector,字符串string,队列queue,栈stack以及集合set的使用方法和实例。这些内容对于提升编程效率和理解C++库的运用十分有帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.取余

​ (1)两数相加取余:

​ (a + b) % p = (a % p + b % p) % p

​ (2)两数相减取余:

​ (a - b) % p = (a % p - b % p) % p

​ a或者b小于零的情况下对p取余看,

​ a每次加p直到为正数为止,再对p取余

​ 代码:

#include <bits/stdc++.h>
using namespace std;

int abs(int a, int b) {
    while (a < 0) {
        a += b;
    }
    return a;
}

int mode(int a, int b) {
    if (a >= 0) {
        return a % b;
    }
    else {
        return abs(a, b) % b;
    }
}

int main()
{
    cout << mode(-2, 5) << endl;

    return 0;
}

​ (3)两数相乘取余:

​ (a * b) % p = (a % p * b % p) % p

​ (4)两数相除取余:

​ 逆元法
( A / B ) % C
= ( A * B^(-1) ) % C
= ((A % C) * ( B^(-1) %C ))%C

	( B ^ ( -1 ) ) % C
	如果 B C 互质  则存在一个整数X 使得 b^( -1 ) ≡ X ( mod C ) 则 X 称为 B 模 C 的乘法逆元 
	记 X = B^(-1)   BX ≡ 1(mod C)
	例
	(2/5)%7
	= ( ( 2%7) * ( 5^(-1) %7) ) %7   // 5 与 7 互质  当 X = 3 时  ( 5*3  ) mod C = 1
	=(( 2 % 7) * (3 % 7) ) % 7
	= 6
二:快速幂

​ 对于任意求幂

		M^(N)= M^(X1+X2+X3..+Xn)=M^(X1) * M(X2)... * M(Xn)

		=M^( 2 ^ (n)  * j)  *  M^( 2 ^ (n-1)  * j) *...*M^( 2 ^ (0)  * j)    	
		
		 //j 为 N二进制第 n 位上的值
		 //循环 维护 2^(n) 的值

例:

		3^(13)13的二进制为  11013^(13)=3^(8 * 1) *  3^(4 * 1) * 3^(2 * 0) * 3^(1 * 1)
	
		=3^(2^(3) * 1) *  3^(2^(2) * 1) * 3^(2^(1) * 0) * 3^(2^(0) * 1)
		

代码

int pow(int n, int X,int max) {
    int re = 1, a = n;
    while (X != 0) {
        if (X % 2) {
            re *= n;
            re %= max;
        }
        n *= n;
        n %= max;
        X /= 2;
    }
    return re;
}
三:阶乘取模

​ a!%b

​ 当 a 的值大于等于 b 的最大质因数时 值为0

​ 例如

​ a! % 666 666 最大的质因数为 111 所以当 a>=111 时 a!666 = 0

四:大数取余

​ 使用数组模拟,按位单独取余 再求和即可

int Mode(char* s, int len,int n) {
    int i, x = 1;
    int sum = 0;

    for (i = 0; len - 1 - i >= 0; i++) {
        sum += (s[len - i - 1] - '0') * x % n;
        x *= 10;
        sum %= n;
    }

    return sum;
}

五:C++STL库

​ (1)可变数组vector

#include <bits/stdc++.h>
using namespace std;

int main()
{
    vector<int> arr;//定义vector数组  初始长度为0

    cout << arr.size() << endl;//数组长度

    arr.push_back(10);//在数组尾部添加一个元素

    if (arr.size() != 0) {
        arr.pop_back();//删除尾部的一个元素  只有数组中有元素时才能进行此操作
    }

    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i] << "  ";// 遍历数组  与普通数组一样
    }

    for (auto i : arr) {
        cout << i << "  ";//增强版for  
    }


    return 0;
}

(2)字符串 string

#include <bits/stdc++.h>
using namespace std;


int main()
{
    string a, b;

    //字符串拼接

    a = "Hello";
    b = " World";
    a += b;
    cout << a << endl; //输出的值为 Hello World
    
    sort(a.begin(), a.end());//排序

    reverse(a.begin(), a.end());//反转字符串

	return 0;
}

(3)队列 queue

#include <bits/stdc++.h>
using namespace std;


int main()
{
    queue<int> qu;//新建队列

    cout << qu.size() << endl;// 队列长度

    qu.push(5);//添加元素

    if (qu.size() > 0) {//当队列不为空时才能访问
        cout << qu.front() << endl;
    }


    if (qu.size() > 0) {
        qu.pop();//出队 当队列不为空时
    }
	
    return 0;
}

​ (4)栈 stack

#include <bits/stdc++.h>
using namespace std;

int main()
{
    stack<int> sta;//新建栈

    cout << sta.size() << endl;//获取栈大小

    sta.push(2);//入栈

    if (sta.size() > 0) {
        cout << sta.top() << endl;//获取栈顶元素
    }

    if (sta.size() != 0) {
        sta.pop();//出栈
    }
    
    return 0;
}

​ (5) set 一个 去重 有序 的集合

#include <bits/stdc++.h>
using namespace std;


int main()
{
    set<int> se;

    se.insert(10);//插入元素

    int len = se.size();//获取大小
    
    se.erase(1);//删除元素  如果没有则不删除

    int min = *se.begin();//获取集合最小值

    int max = *se.rbegin();//获取集合最大值

    se.count(5);//查询值是否存在

    for (auto i : se) {//遍历
        cout << i << endl;
    }
    
    return 0;
}

### C++ STL 内存管理机制及其实现方式 #### 1. 基本概念 C++ 的标准模板 (STL) 提供了一套高效的内存管理机制,旨在优化性能并减少资源浪费。这些机制主要通过 `std::allocator` 和其他底层原语实现[^2]。 #### 2. std::allocator 的作用 `std::allocator` 是 C++ 标准中的默认分配器,负责提供基本的内存分配和对象管理功能。它定义在 `<memory>` 头文件中,并提供了以下核心方法: - **allocate**: 分配原始未初始化的内存。 - **deallocate**: 释放已分配的内存。 - **construct**: 构造对象实例。 - **destroy**: 销毁对象实例。 这种设计使得开发者可以轻松定制自己的分配策略,而无需修改容器本身的逻辑。 #### 3. SGI 实现中的内存池技术 为了进一步提升效率,特别是针对频繁的小规模内存分配场景,SGI 版本的 STL 引入了内存池的概念。具体来说,在第二级配置器 `__default_alloc_template` 中内置了一个轻量级的内存池[^5]。 当应用程序请求较小尺寸的连续存储区域时(通常小于等于 128 字节),该配置器不会直接调用操作系统级别的 `malloc` 或者 `new` 操作符,而是尝试从预先准备好的空闲链表(Free List)中获可用块。一旦某个小块被释放回系统,则重新加入对应类型的 Free List 节点列表等待下次重用。 这种方法显著减少了因频繁调用低效全局函数而导致的时间开销以及潜在碎片化风险。 #### 4. 自动生成特殊成员函数的行为控制 (= default, = delete) 除了上述高级别的框架外,C++ 还允许程序员显式指定某些情况下如何处理类内部涉及生命周期管理的部分操作: - 使用`=default`关键字可以让编译器为我们创建一个合理的缺省版本(比如拷贝构造函数),即使我们已经声明了自己的自定义版本也不会阻止它们的存在; - 如果希望完全禁掉某特定行为则可采用`=delete`语法形式表明意图[^4]. 这不仅简化了许多常见模式下的编码工作量同时也增强了代码的安全性和可控度. ```cpp // 示例:显示定义与删除特有方法 class MyClass { public: MyClass() = default; MyClass(const MyClass&) = delete; // 禁止复制 }; ``` #### 5. 辅助工具 - 仿函数(Functor) 虽然严格意义上不属于传统意义上的“内存管理”,但在实际开发过程中经常配合使用的还有各种各样的仿函数结构体。例如算术运算相关的加减乘除等功能都可以借助预定义模板快速构建出来而不必每次都手写匿名lambda表达式[^3]: ```cpp #include <functional> int main(){ int a=10,b=7; auto sum = std::plus<int>()(a,b); // 计算两数之和 } ``` 以上就是围绕着C++ STL体系下有关内存管控方面的一些基础知识介绍及其背后原理剖析.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值