c++ 进制转换,字母大小写转换,map按值排序 简单函数

9 篇文章 0 订阅


记录一下常用自定义函数


一.进制转换

在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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值