记录一下常用自定义函数
一.进制转换
在cstdlib(stdlib.h)标准库文件里面有个itoa(_itoa,_itoa_s)函数,但不在ANSI C 里面,也不是C++部分里面的,而且只是部分编译器支持这个函数,所以尽量别用这玩意.参考原文(http://www.cplusplus.com/reference/cstdlib/itoa/)
Portability
This function is not defined in ANSI-C and is not part of C++, but is supported by some compilers.
1.十进制数转二进制String
string decToBin(int n)
{
string bin;
char tem[2];
while (n != 0)
{
snprintf(tem, sizeof(tem), "%d", n % 2);
bin.push_back(tem[0]);
n /= 2;
}
return string(bin.rbegin(), bin.rend());
}
2.十进制数转八进制,十进制,十六进制字符串.还有基于各种进制字符串转换成十进制长整型(可以是二进制哦)
参考函数sprintf(点这里),strtol(点这里)等等.
不过 vs2015 说 sprintf函数不安全,应该是因为第一个参数是char *,叫我用sprintf_s
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int n = 32;
//十进制转换成八进制,十六进制字符串
char str1[10],str2[10], str3[10];
sprintf_s(str1, "%d", n); // 32 十进制
sprintf_s(str2, "%x", n + 1); // 21 十六进制
sprintf_s(str3, "%o", n + 2); // 42 八进制
cout << str1 << endl << str2 << endl << str3 << endl;
//各种进制字符串转换成十进制
long int n1, n2, n3 ,n4;
n1 = strtol(str1, NULL, 10); // 32 基于十进制
n2 = strtol(str2, NULL, 16); // 33 基于十六进制 (可以加前缀0x)
n3 = strtol(str3, NULL, 8); // 34 基于八进制 (可以加前缀0)
n4 = strtol(str1, NULL, 4); // 14 基于其他进制等等,转化失败的话回返回0
cout << n1 << endl << n2 << endl << n3 << endl << n4 << endl;
system("pause");
return 0;
}
二.字母大小写转换
刚好学了汇编语言,老师讲了个碉堡了的大小写转换方法.
因为字母大小写的ascii码相差0010 0000,即二的五次幂,直接做与运算,或运算就可以了.= =当然前提是字母.
//变大
void strBigger(string & str)
{
for (int i = 0; i < str.size(); i++)
{
str[i] &= 0xDF;
//另一种方法 toupper(char) 需要导头文件 <cctype>, 原码就下面这行
//#define __ascii_toupper(c) ( (((c) >= 'a') && ((c) <= 'z')) ? ((c) - 'a' + 'A') : (c) )
//str[i] = toupper(str[i]);
}
}
//变小
void strLess(string & str)
{
for (int i = 0; i < str.size(); i++)
{
str[i] |= 0x20;
//str[i] = tolower(str[i]);
}
}
三.std::map按value排序,返回存有map的vector
因为map不能用sort直接排序value,所以可以借助vector来实现按value排序
typedef pair<int, int> PAIR; vector<PAIR> sortByValue(map<int,int> & m) { vector<PAIR> vecM(m.begin(), m.end()); sort(vecM.begin(), vecM.end(), [](const PAIR& p1, const PAIR& p2) { return p1.second < p2.second; }); return vecM; }