常用工具函数

//一些可能会用到的小功能

/*目录
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;
}

最后更新于

这有帮助吗?