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
- 关于
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;
- 关于
deque
和vector
的一些操作
.back()
和.front
方法可以取出首尾元素push_back() & push_front()
方法用于在首尾添加元素pop_front()& pop_back()
可以删除首尾的元素