C++算法题中常见语法问题

写在开头

本文将汇总刷题过程中遇到的一系列有关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;
}

 因此,集合的遍历常用以下几种方式

  1. 使用迭代器遍历,这是一种最常见的遍历方式
    for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
    		cout << *it << " ";
    	}
  2. 使用范围基础的for循环进行遍历
    for (const auto &elem : s) {
    	for (int i = 0; i < elem.size(); i++) {
    		cout << elem[i] << " ";
    	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzr-rr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值