一些实用的功能函数

本文详细介绍了算法中的位不同计数、字符串分割、十六进制转十进制、整数转换、去重、bitset操作以及小数保留和容器操作等技术,展示了在IT领域的实用技巧和优化方法。
摘要由CSDN通过智能技术生成

1. 【算法】求两个数中,bit位不同的个数(在计网那道题中用过)
解法:首先把两位数异或,得到的结果,通过自身跟自身-1相与,直到等于0为止
在这里插入图片描述
代码如下:

int calculateNotSam(int a,int b){
	    	int temp=a^b;
	    	int number=0;
	    	while(temp!=0){
	    		temp&=(temp-1);
	    		number++;
	    	}
	    	return number;
	    }

2. 【算法】对于某个字符串,用某个符号分割开来

//将字符串str用sp分割开来,分割的每项元素存储在ans当中
vector<string> split(string str, string sp)
{
    vector<string> ans;
    for(ll i = 0, j = 0; i < str.size();i = j + 1){
        j = str.find(sp, i);
        if(j == -1){
            j = str.size();
        }
        ans.push_back(str.substr(i, j - i));
    }
    return ans;
}

3. 【算法】 输入字符串,该字符串是用16进制的表示输入,将其转化为十进制数(解压缩中遇到过)

//将一个字符转化为十进制数
int trans_10(char ch)
{
    if(ch >= '0' && ch <= '9') return ch - '0';
    if(ch >= 'a' && ch <= 'f') return ch - 'a' + 10;
}
int a = trans_10(bits[0]), b = trans_10(bits[1]);
int number = (a << 4) + b;   //十六进制一个字符代表4个bit位置

4. 【算法】 将一串数字字符转化为整数

int to_int(string str)
{
    stringstream ssin(str);
    int x;
    ssin >> x;
    return x;
}

5. vector去除相邻的重复元素

vector<int> vec;
    for(int i = 8;i >= 1;i --){
        vec.push_back(i);
        vec.push_back(i - 1);
    }
    for(auto x : vec){
        cout << x << ' ';
    }
    cout << endl;
    //sort(vec.begin(), unique(vec.begin(), vec.end()));
    vec.erase(unique(vec.begin(),vec.end()), vec.end());
    for(auto x : vec){
        cout << x << ' ';
    }
    cout << endl;

输出如下:

8 7 7 6 6 5 5 4 4 3 3 2 2 1 1 0
8 7 6 5 4 3 2 1 0

  1. 关于bitset(在LDAP的优化中用到)

构造函数

  • bitset(): 每一位都是 false。
  • bitset(unsigned long val): 设为 val 的二进制形式。
  • bitset(const string& str): 设为 01 串 str。

运算符

  • operator []: 访问其特定的一位。
  • operator ==/!=: 比较两个 bitset 内容是否完全一样。
  • operator &/&=/|/| =/^/^=/~: 进行按位与/或/异或/取反操作。bitset 只能与 bitset 进行位运算,若要和整型进行位运算,要先将整型转换为 bitset。
  • operator <>/<<=/>>=: 进行二进制左移/右移。
  • operator <>: 流运算符,这意味着你可以通过 cin/cout 进行输入输出。
    成员函数
    count(): 返回 true 的数量。
  • size(): 返回 bitset 的大小。
    test(pos): 它和 vector 中的 at() 的作用是一样的,和 [] 运算符的区别就是越界检查。
  • any():若存在某一位是 true 则返回 true,否则返回 false。
    none(): 若所有位都是 false 则返回 true,否则返回 false。
  • all():C++11,若所有位都是 true 则返回 true,否则返回 false。
  • set(): 将整个 bitset 设置成 true。
  • set(pos, val = true):将某一位设置成 true/false。
  • reset(): 将整个 bitset 设置成 false。
  • reset(pos): 将某一位设置成 false。相当于 set(pos, false)。
  • flip(): 翻转每一位。(0\leftrightarrow1,相当于异或一个全是 1 的 bitset)
  • flip(pos): 翻转某一位。
  • to_string(): 返回转换成的字符串表达。
  • to_ulong(): 返回转换成的 unsigned long 表达(long 在 NT 及 32 位 POSIX 系统下与 int 一样,在 64 位 POSIX 下与 long long 一样)。
  • to_ullong():C++11,返回转换成的 unsigned long long 表达。

一些文档中没有的成员函数:

  • _Find_first(): 返回 bitset 第一个 true 的下标,若没有 true 则返回 bitset 的大小。
  • _Find_next(pos): 返回 pos 后面(下标严格大于 pos 的位置)第一个 true 的下标,若 pos 后面没有 true 则返回 bitset 的大小。

7. 保留小数

  • 保留n位有效数位#include<iomanip>
    cout << setprecision(n) << a
  • 保留小数点后n位#include<iomanip>
    cout << setiosflags(ios::fixed) << setprecision(n) << a;
  1. 关于dequevector的一些操作
  • .back().front方法可以取出首尾元素
  • push_back() & push_front()方法用于在首尾添加元素
  • pop_front()& pop_back()可以删除首尾的元素
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值