常用工具函数
//一些可能会用到的小功能
/*目录
1. 判断回文
2. 去除字符串前后空格 trim
3. 数字转字符串
4. 字符串转数字
5. 二分查找
6. 判断奇偶
7. 打印二维vector
8. 字符串分割
9. 对map按值排序
10. 判断一个字符串是否包含另一个字符串
11. 打印队列元素(容器适配器)
12. 打印有begin()的容器(顺序容器和管理容器)
13. 计算概率中的C(m,n)
14. split
*/
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
using namespace std;
//1. 判断回文
bool is_huiwen(string s){
if(s.empty()){
return false;
}
string s2=s;
reverse(s2.begin(),s2.end());
return s2==s;
}
//2. 去除字符串前后空格
string trim(string s){
string blanks("\f\v\r\t\n ");
s.erase(0,s.find_first_not_of(blanks));
s.erase(s.find_last_not_of(blanks) + 1);
return s;
}
#include<stdlib.h>
#include<stdio.h>
//3. 数字转字符串
//char *itoa(int value, char *string, int radix);
//itoa不是标准,是windows特有的
string num2str(int num){
char rel[64]; //注意这个空间的问题
if(num<0){
num=-num;
sprintf(rel,"-%d",num);
}else{
sprintf(rel,"%d",num);
}
return string(rel);
}
//4. 字符串转数字
//C标准库atoi, atof, atol, atoll(C++11标准) 函数
//将字符串转换成int,double, long, long long 型
int str2num(string s){
s=trim(s);
const char* c=s.data();
const char* c2=s.c_str();//这两个都是把string转换成const char*
int num;
// if(c[0]=='-'){
// sscanf(c,"%d",&num);
// }else{
// sscanf(c,"%d",&num);
// }
//注意!!!!没有必要判断
sscanf(c,"%d",&num);
return num;
}
//5. 二分查找
//对有序序列的查找,时间复杂度logN
// template<class T>
int binary_search(vector<int> nums,int target){
int left=0;
int right=nums.size()-1;
int mid=(right+left)/2;
if(nums[mid]==target){
return mid;
}
while(left<right){
if(nums[mid]==target){
return mid;
}else if(nums[mid]<target){
left=mid;
}else{
right=mid;
}
mid=(right+left)/2;
}
return -1;
}
/* 6. 判断奇偶 */
bool isEven(int num){
if(num<0){
return false;
}
if(num%2==0){
return true;
}
return false;
}
/* 7. 打印二维vector */
void print_vector2(vector<vector<int>> &rel){
for(int i=0;i<rel.size();i++){
for( int j=0;j<rel[0].size();j++){
cout<<rel[i][j]<<" ";
}
cout<<endl;
}
}
/* 8. 字符串分割 */
vector<string> split(string str,string pattern)
{
size_t pos;
vector<string> result;
str+=pattern;//扩展字符串以方便操作
int size=str.size();
for(int i=0; i<size; i++)
{
pos=str.find(pattern,i);
if(pos<size)
{
string s=str.substr(i,pos-i);
result.push_back(s);
i=pos+pattern.size()-1;
}
}
return result;
}
/* 9. 对map按值排序呢
1. 用vector<pair>类型
2. 用仿函数
*/
#define PAIR pair<string,int>
class map_compare{
public:
bool operator()(const PAIR& lhs,const PAIR& rhs){
return lhs.second>rhs.second;
}
};
vector<PAIR> map_sort(map<string,int> &m){
vector<PAIR> rel(m.begin(),m.end());
sort(rel.begin(),rel.end(),map_compare());
return rel;
}
/* 10.判断一个字符串是否包含另一个字符串
*/
bool contain(string source,string target){
int len=target.size();
for(int i=0;i<=source.size()-len;++i){
string temp=source.substr(i,len);
if(temp==target){
return true;
}
}
return false;
}
/* 11. 打印队列元素(容器适配器)
*/
void print_queue(queue<int>& q){
vector<int> temp_storage;
while(!q.empty()){
temp_storage.push_back(q.front());
q.pop();
}
print_container(temp_storage);
// 打印完重新加入队列
for(int i=0;i<temp_storage.size();++i){
q.push(temp_storage[i]);
}
}
/* 12. 打印有begin()的容器(顺序容器和管理容器)
*/
void print_container(vector<int>& v){
for(auto it=v.begin();it!=v.end()-1;++it){
cout<<*it<<' ';
}
cout<<v.back()<<endl;
}
/* 13. 计算概率中的C(m,n)
在m个数中找n个的可能性
*/
unsigned int C(unsigned int m,unsigned int n){
// 假设输入没问题
unsigned int fenmu=1,fenzi=1;
// 计算分母
for(int i=2;i<=n;++i){
fenmu *= i;
}
// 计算分子
for(int i=0;i<n;++i){
fenzi *= (m-i);
}
return fenzi/fenmu;
}
/* 14. split
分割字符串
*/
void split(const string& s, vector<string>& tokens, const string& delimiters = " ")
{
string::size_type lastPos = s.find_first_not_of(delimiters, 0);
string::size_type pos = s.find_first_of(delimiters, lastPos);
while (string::npos != pos || string::npos != lastPos) {
tokens.push_back(s.substr(lastPos, pos - lastPos));
lastPos = s.find_first_not_of(delimiters, pos);
pos = s.find_first_of(delimiters, lastPos);
}
}
//测试
int main(){
string s;
cin>>s;
vector<string> rel;
rel=split(s,";");
for(int i=0;i<rel.size();++i){
cout<<rel[i]<<endl;
}
return 0;
}
最后更新于
这有帮助吗?