写在开头
本文将汇总刷题过程中遇到的一系列有关C++语言本身特性和编译器版本不同造成的问题,并且将持续更新。
初始化问题
在定义一个变量未进行初始化
int main() {
int ans;
cout << ans << endl;
return 0;
}
报错信息
如果变量在以后的代码中会重新定义数值(注意不能是直接++/+=等操作),不会出现问题,但最好在初始化的时候就进行初始化。
数组长度的初始化
int main() {
int n = 5;
int arr[n];
return 0;
}
报错信息
在 C++ 中,数组的长度必须是编译时的常量,也就是说,数组的长度不能由变量来确定。数组的长度在编译时就需要确定,并且在数组声明时必须使用常量表达式来指定长度。
如果想要在运行过程中动态确定数组的长度,可以使用动态内存分配和指针来实现。例如,可以使用 new
运算符来动态分配内存,并在运行时指定数组的长度。示例如下:
int main() {
int n = 5;
int* arr = new int[n];
delete[] arr;
return 0;
}
类和结构体
结构体和类的构造结构
leetcode上有一道设计链表的题目,我们需要在函数中首先构造有关链表的结构体,如下代码所示,需要注意的是,结构体和类一样,括号最后需要加上分号,不然会有如下的报错。
class MyLinkedList {
public:
struct LinkedNode{
int val;
LinkedNode* next;
LinkedNode(int val){
this->val = val;
this->next = nullptr;
}
}
MyLinkedList() {
}
int get(int index) {
}
void addAtHead(int val) {
}
void addAtTail(int val) {
}
void addAtIndex(int index, int val) {
}
void deleteAtIndex(int index) {
}
};
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList* obj = new MyLinkedList();
* int param_1 = obj->get(index);
* obj->addAtHead(val);
* obj->addAtTail(val);
* obj->addAtIndex(index,val);
* obj->deleteAtIndex(index);
*/
而这样的错误在较为复杂的代码中,由于会和下面的函数发生冲突,不会直接返回缺少;的信息,因此较难发现。
在这里顺便总结一下易混概念类和结构体的部分知识点。
在C++中,类的构造函数和结构体的构造函数的概念是相同的。构造函数是一种特殊的成员函数,用于在创建类或结构体的对象时进行初始化操作。
构造函数的名称与类或结构体的名称相同,并且没有返回类型(包括void
)。构造函数可以带有参数,这些参数用于初始化对象的成员变量。当创建对象时,编译器会自动调用适当的构造函数来初始化对象。
数组
查找元素
vector查找元素通常会用到find元素去定位,如:
vector<int> v = { 1, 2, 3, 4, 5 };
auto it = find(v.begin(), v.end(), 2);
我们需要注意的是区间的开闭,v.begin()为闭,v.end()为开,需要注意的是如果找不到,返回的值是开区间端点,而不是永远都是数组的尾端。
vector<int> v = { 1, 2, 3, 4, 5 };
auto it = find(v.begin(), v.begin() + 2, 5);
如该例,如果找不到,it就应该等于v.begin() + 2
集合
集合的遍历
set作为常见的容器之一,首先要了解其特征,集合是无序的,且不会有重复的元素,这也就意味着用遍历数组的方式遍历一个集合是无效的。
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
for (int i = 0; i < s.size(); i++) {
cout << s[i] << endl;
}
因此,集合的遍历常用以下几种方式
- 使用迭代器遍历,这是一种最常见的遍历方式
for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; }
- 使用范围基础的for循环进行遍历
for (const auto &elem : s) { for (int i = 0; i < elem.size(); i++) { cout << elem[i] << " "; }