转换模板
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
// 多参数函数模板:实现任意类型转换
// 将要转换的数据放入stringstream流中,
// 然后将流中的数据放入我们转换目标对象,最后返回转换后的
// 调用:out_type o = convert<out_type>(in_value)
template<typename out_type, typename in_value>
out_type convert(const in_value & t){
stringstream stream;
stream << t;//向流中传值
out_type result;//这里存储转换结果
stream >> result;//向result中写入值
return result;
}
int main(){
// 字符串 -> 整数
string str = "0012345";
int sta = convert<int>(str);
cout << sta << endl;
// 整数 -> 字符串
int a = 56789;
string ats = convert<string>(a);
cout << ats << endl;
// 字符 -> 整数
char c = '9';
int cti = convert<int>(c);
cout << cti << endl;
cout << c - '0' << endl;
// 整数 -> 字符
int b = 7;
char itc = convert<char>(b);
cout << itc << endl;
cout << char(b + '0') << endl;
}
/*输出:
12345
56789
9
9
7
7
*/
常用操作
#include <cctype>
char c
isdigit(c) // c是否是 数字
isalpha(c) // c是否是 字母
islower(c) // c是否为 小写字母
isupper(c) // c是否为 大写字母
isalnum(c) // c是否为 字母or数字
isspace(c) // c是否为 空格
tolower(c) // c转化为小写
toupper(c) // c转化为大写
string str
char ch
1.翻转字符串
①reverse( str.begin(), str.end() ) 没有返回值
②string new_str( str.rbegin(), str.rend() ) 有返回值
2.清空字符串
①str.clear()
②str = ""
3.字符与数字之间转换
①to_string(int a) 数字 -> 字符串 ,如 9 -> "9"
②int a = ch - '0' 字符 -> 数字 , 如 '9' -> 9
③int a + '0' = char(ch) 数字 -> 字符 ,如 9 -> '9' ,不要漏掉char,不然输出的是对应的ASCII码,而不是字符了
④int t = stoi(str); 字符串->数字
自己写的函数:
int str2int(const string& str) //字符串转数字
{
int temp = 0;
const char ptr = str[0]; //ptr保存str字符串开头
//判断正负数
string str_t;
if(ptr == '-') str_t = string(str.begin()+1, str.end());
else str_t = str;
int n = str_t.size();
for(auto str:str_t)
{
if ((str < '0') || (str > '9')) //如果当前字符不是数字
{ //则退出循环
break;
}
temp = temp * 10 + (str - '0'); //如果当前字符是数字则计算数值
}
if (ptr == '-') //如果字符串是以“-”开头,则转换成其相反数
{
temp = -temp;
}
return temp;
}
4.大小写转换
①tolower(ch) 或者 ch + 32 将ch转换为小写 经常记成to_lower!!!!切记,没有下划线啊
②toupper(ch) 或者 ch - 32 将ch转换为大写
5.字符拼接
①string str_new = string( str.begin()+1, str.end() ) + str[0] 表示将第一个字符放到最后的位置
②.string tmp = str.substr(i, 2) 从i位置开始截取两个字符
6.增删查改
- 改变string
- 下标来删除或者插入元素
- s.insert(pos, n, '!') // 在 pos位置之前插入 n 个 '!', 可以通过下标来插入元素
- s.erase(pos, n) // 删除从pos位置开始的n个元素
- append or replace函数
- s.append(s1) // 在s尾部追加字符串s1
- s.replace(begin, n, s1) // 从位置begin开始,删除n个字符,并插入字符串s1,s1的长度不需要跟n相同
- 下标来删除或者插入元素
- 搜索操作
- s.find(c) // 返回字符 or 字符串c 第一次出现的位置, 找不到返回 string::npos
- s.rfind(c) // 返回字符 or 字符串 c 最后一次出现的位置
- s.find(substr, pos ) // 在s中,从pos位置开始, 找第一次出现substr的位置
- 常见的题型:找出字符串 中 子串 出现的所有位置进行替换为新字符串
-
string::size_type pos = 0; while((pos = s.find(oldStr, pos)) != string::npos){ s.replace(pos, oldStr.size(), newStr); pos += newStr.size(); // 更新开始搜索位置为替换newStr后的位置(这时候才是原字符串的位置) }
C标准库string函数
strlen(p1); // 返回p1的长度,空字符不计算在内
strcpy(p1, p2); // p2拷贝到p1 ,返回p1
strcmp(p1, p2); // p1 == p2 返回 0 ,p1 < p2 返回负值, p1 > p2返回正值
strcat(p1, p2); // p2追加到p1,返回p1
#include <cstring>
#include <iostream>
using namespace std;
int main(){
char ch1[] = {'h', 'e', 'l', 'l', 'o', '\0'};
char ch2[] = {'w', 'o', 'r', 'l', 'd', '\0'};
char* p1 = ch1;
char* p2 = ch2;
cout << p1 << " , " << p2 << endl; // hello , world
cout << "-------------------" << endl;
int len = strlen(p1); // 返回p1的长度,空字符不计算在内
cout << len << endl; // 5
int t = strcmp(p1, p2); // p1 == p2 返回 0 ,p1 < p2 返回负值, p1 > p2返回正值
cout << t << endl; // -15
char* p3 = strcat(p1, p2); // p2追加到p1,返回p1
cout << p3 << endl; // helloworld
char *p4 = strcpy(p1, p2); // p1 = p2,返回p1
cout << p4 << endl; // world
return 0;
}
C风格与C++风格字符串接口
string s = "hello world!";
string类型==>C风格的字符串,需要调用c_str()接口
const char* str = s.c_str() // 不改变const属性
char* str = const_cast<char *>(s.c_str()) // 改变const属性
C字符串 ==》 string
1)直接赋值;2)构造转换实现
// char*转换为string
// (注意,定义char *变量,并直接赋值,最好定义为const变量,否则编译器警告)
const char *st = "hello";
// 赋值转换
string st1 = st;
cout << st1 << endl;
// 构造转换
string s1(st, st + strlen(st));
cout << s1 << endl;
// 改变const char *变量值
st = "lalala";
cout << st << endl;
const char* p; p是一个变量指针,指向一个常量地址,p本身的地址可以改变,指向的那块地址的内容不能改变
C库函数
1、qsort
功能: 使用快速排序例程进行排序
头文件:stdlib.h
用法: void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
参数: 1 待排序数组,排序之后的结果仍放在这个数组中
2 数组中待排序元素数量
3 各元素的占用空间大小(单位为字节)
4 指向函数的指针,用于确定排序的顺序(需要用户自定义一个比较函数)qsort要求提供一个自己定义的比较函数。比较函数使得qsort通用性更好,有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。
如比较函数 int cmp(const void *a, const void *b) 中有两个元素作为参数(参数的格式不能变),返回一个int值,比较函数cmp的作用就是给qsort指明元素的大小是怎么比较的。
比如对int类型排序
int num[100];
int cmp_int(const void* _a , const void* _b) //参数格式固定
{
int* a = (int*)_a; //强制类型转换
int* b = (int*)_b;
return *a - *b;
}
qsort(num,100,sizeof(num[0]),cmp_int);
可见,参数列表是两个空指针,现在他要去指向你的数组元素。所以转换为你当前的类型,然后取值。默认升序排列(从小到大),如果想降序排列返回*b-*a即可。
比如对字符串排序
char word[100][10];
int cmp_string(const void* _a , const void* _b) //参数格式固定
{
char* a = (char*)_a; //强制类型转换
char* b = (char*)_b;
return strcmp(a,b);
}
qsort(word,100,sizeof(word[0]),cmp_string);
关于double的要注意,返回的不一样
double in[100];
int cmp_double(const void* _a , const void* _b) //参数格式固定
{
double* a = (double*)_a; //强制类型转换
double* b = (double*)_b;
return *a > *b ? 1 : -1; //特别注意
}
qsort(in,100,sizeof(in[0]),cmp_double);
在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系