一. reverse函数
###在写回文题的时候有以下函数:
高精度反转:
(在计算高精度时,我们输入的是从高位到低位,但在计算时从低位到高位,因此需要反转)
void turn(int a[])//反转数字
{int j = 0;for(int i = l; i >= 1; i--)//反着存 { w[++j] = a[i];//存到w数组里 }
于是在 C++STL 中有了reverse函数
#include <iostream>
#include <vector>
#include <algorithm>//reverse函数的头文件int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 反转整个容器std::reverse(vec.begin(), vec.end());for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;// 反转容器的一部分std::vector<int> vec2 = {1, 2, 3, 4, 5};std::reverse(vec2.begin(), vec2.begin() + 2);for (int num : vec2) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
输出:
5 4 3 2 1
2 1 3 4 5
顺带提及isdigit函数:用于检查给定的字符是否为数字
这个函数定义在 (C++)或 <ctype.h>(C)头文件中。
isdigit
是C和C++标准库中的一个函数,用于检查给定的字符是否为数字。这个函数定义在 <cctype>
(C++)或 <ctype.h>
(C)头文件中。
函数原型
在C中:
int isdigit(int c);
在C++中:
bool isdigit(int c);
参数
c
:要检查的字符。
返回值
- 如果
c
是一个数字字符(‘0’ 到 ‘9’),函数返回非零值(在C中)或true
(在C++中)。 - 如果
c
不是一个数字字符,函数返回0(在C中)或false
(在C++中)。
二.strcspn函数
strcspn 是 C 语言标准库中的一个函数,它用于计算两个字符串中第一次出现的字符集合的匹配次数。具体来说,strcspn 函数返回两个字符串的最长前缀长度,这个前缀中不包含指定的字符集合。
char str[] = "Hello\n";
str[strcspn(str, "\n")] = '\0'; // 将换行符替换为字符串结束符
写出一些处理字符串的函数
都定义在 <string.h>
头文件中。
- strcpy(s1, s2):将字符串
s2
复制到字符串s1
中。 - strncpy(s1, s2, n):将字符串
s2
的前n
个字符复制到字符串s1
中。 - strcat(s1, s2):将字符串
s2
连接到字符串s1
的末尾。 - strncat(s1, s2, n):将字符串
s2
的前n
个字符连接到字符串s1
的末尾。 - strcmp(s1, s2):比较两个字符串
s1
和s2
,如果s1
小于s2
返回负数,相等返回 0,大于返回正数。 - strncmp(s1, s2, n):比较两个字符串
s1
和s2
的前n
个字符。 - strlen(s):计算字符串
s
的长度,不包括最后的空字符\0
。 - strchr(s, c):在字符串
s
中查找字符c
的第一次出现。 - strrchr(s, c):在字符串
s
中查找字符c
的最后一次出现。 - strstr(s1, s2):在字符串
s1
中查找子串s2
的第一次出现。 - strspn(s1, s2):计算字符串
s1
和s2
的最长公共前缀长度,这个前缀中的所有字符都必须在s2
中出现。 - strcspn(s1, s2):计算字符串
s1
和s2
的最长公共前缀长度,这个前缀中的所有字符都不在s2
中出现。 - strtok(s1, s2):根据
s2
中的分隔符分割s1
字符串,返回分割后的各个子串。 - strdup(s):动态分配内存并复制字符串
s
到这块内存中。 - strerror(errnum):根据错误代码
errnum
返回对应的错误信息字符串。 - memset(s, c, n):将字符串
s
的前n
个字符设置为字符c
。 - memmove(s1, s2, n):移动
n
个字符从字符串s2
到s1
,s1
和s2
可以重叠。 - memcpy(s1, s2, n):复制
n
个字符从字符串s2
到s1
,s1
和s2
不能重叠。 - memcmp(s1, s2, n):比较两个字符串
s1
和s2
的前n
个字符。
三.结构体构造函数
1.成员函数
struct Students {// 这是普通成员数据string name;int age;// 下面定义成员函数,修改成员数据值void set(string name, int year) {// 形参与成员数据同名时,用this->访问成员数据this->name = name;age = year;}
};// 某函数中
Students stu;
stu.set("a", 18); // 调用成员函数
cout << stu.name << ' ' << endl; // 输出:a
(1)this指针
this 指针通常用于指向当前对象的实例,允许成员函数访问对象的数据成员和成员函数。
class MyClass {
public:void display() {std::cout << "Value: " << this->value << std::endl;}private:int value;
};int main() {MyClass obj;obj.value = 10;obj.display(); // 输出: Value: 10return 0;
}
在上面的例子中,this->value 指的是 MyClass 对象 obj 的 value 成员。
(display:在屏幕上显示)
2.构造函数
struct Students {string name;int age;int grade;Students(string name, int score) : age(18), grade(score) {this->name = name; // 用"->"访问成员变量}// 构造函数可以重载(形参列表不同)Students(): name("jkz"), age(18), grade(100) {} // {}不能丢掉
}
3.用来创建链表节点
// 定义结构体
struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};
// 创建节点
// 必须使用new运算符使用堆区空间,以免产生内存错误
ListNode* h = new ListNode(值域的值)// 修改值域,连接新节点
h->next = new ListNode(值域的值)// 往后移动节点
h = h->next// 其他操作……
四.new运算符
不仅分配内存,还可以调用对象的构造函数(如果对象是类的一个实例)
初步认为 new 和 delete 相当于 C 语言中的 malloc 和 free
五.inline关键字
在C++中,inline 关键字用于建议编译器在编译时将函数的定义直接插入到每个函数调用的地方,而不是进行常规的函数调用。这样做的目的是为了减少函数调用的开销,尤其是在函数体较小的情况下。inline 函数通常被用于提高程序的执行效率,尤其是在函数调用频繁的情况下。
简单来说:我现在写代码都能在void前面加一个inline以减少开销,不能用goto~反正我又用不到
相当于 加速
六.字符以数组的形式输入
#include<stdio.h>
int main(){int n;scanf("%d",&n);char a[n][100];for(int i=0;i<n;i++)scanf("%s",a[i]); return 0;
}
不是a[n]而是a[n][100];
注意不用&,a[i]本身已经是地址。