2024年【C++】C+(1),大数据开发面试算法题

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

int arr2[]{ 1,2,3 };// 列表初始化
return 0;

}


以前`{}`只能用来初始化结构体和数组,而现在**一切皆可用列表初始化。**


当然new操作符也可以使用`{}`初始化:



int* ptr1 = new int[] {1, 2, 3};
Test* ptr2 = new Test[]{ {1, 1.1}, {2, 2.2} };


对于自定义类型`{}`会调用它的构造函数初始化:



class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
std::cout << “Date(int year, int month, int day)” << std::endl;
}
private:
int _year;
int _month;
int _day;
};

int main()
{
Date d1(1, 2, 3);
Date d2{1, 2, 3};
return 0;
}


![在这里插入图片描述](https://img-blog.csdnimg.cn/6775f5409a2e4f0bb74a16d9fe033241.png)  
 其他一些不方便初始化的地方使用, 比如stl的初始化, 如果不使用这种方式, 只能用构造函数来初始化, 难以达到效果 。



int main()
{
std::vector v={ 1, 2, 3, 4, 5 };// 列表初始化
std::list lt{ 1, 2, 3, 4, 5, 6 };// 列表初始化
for (auto& e : v)
{
std::cout << e << " ";
}
std::cout << “\n”;
for (auto& e : lt)
{
std::cout << e << " ";
}
std::cout << “\n”;
return 0;
}


![在这里插入图片描述](https://img-blog.csdnimg.cn/6c14ee42ae8a45b3bfe6059fd3d43002.png)  
 这里明显不是使用构造函数初始化的  
 **那么这里是怎么做到的呢?**  
 利用std::initializer\_list类型。


### 1.2 initializer\_list类型



int main()
{
auto tmp = { 1, 2, 3, 4 };
std::cout << typeid(tmp).name() << std::endl;
return 0;
}


![在这里插入图片描述](https://img-blog.csdnimg.cn/4f61949f22ab419592c812c0a8d8fe76.png)**`typeid(变量名).name()` 查看变量的类型**  
 我们可以把它理解为一个**存在常量区数组**。  
 这个容器有以下接口:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5fd3594ca5c0457d89f4986b43b466f4.png)  
 这样我们就可以像迭代器一样使用这个容器。  
 所以vector和list就可以这样初始化:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/80158c8919ef4fcc804212783bbc3fb3.png)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f90c8a43a47b487f87d2115b62d47135.png)  
 其实使用initializer\_list初始化就是遍历initializer\_list的内容然后一个一个插入。



vector(initializer_list il)
:_start(nullptr)
, _finish(nullptr)
, _endofstorage(nullptr)
{
reserve(il.size());// 防止过度扩容
typename initializer_list::iterator it = il.begin();
while (it != il.end())
{
push_back(*it);
++it;
}
}


## 二、类型推导


### 2.1 auto


`auto`的作用就是**自动推导对象的类型**。从这个意义上讲,`auto`并非一种"类型"声明,而是一个类型声明时的"占位符",编译器在编译时期会将`auto`替换为变量实际的类型。



double foo()
{
return 1.1;
}

struct Test
{};

int main()
{
// 内置类型
int a = 1;
auto b = a;// int
auto c = foo();// double

// 自定义类型
Test test;
auto ret = test;// struct Test
return 0;

}


### 2.2 auto注意事项


**1️⃣ 首先定义变量的时候一定要初始化**



auto a;// error
a = 10;


**2️⃣ 不能作为函数的形参**



void func(auto a) {}// error


**3️⃣ 变量不能作为自定义类型的成员变量**



struct Test
{
auto a = 1;// error
};


**4️⃣ 不能是auto数组**



auto arr[] = { 1, 2, 3 };// error


**5️⃣ 模板实例化类型不能是auto类型**



std::vector v;// error


### 2.3 decltype


关键字decltype将变量的类型声明为表达式指定的类型。我前面用的`typeid(x).name()`可以拿到x类型的字符串,但是不能使用这个再去定义一个变量。  
 而decltype却可以拿到变量,后面还可以继续使用这个类型定义出变量。



int main()
{
int x = 0;
decltype(x) a = 10;// int
double y = 0.0;
decltype(x + y) b;// double
return 0;
}


## 三、新增与改进


### 3.1 nullptr


nullptr 是为了解决原来 C++中 NULL 的二义性问题而引进的一种新的类型,因为NULL既能表示整型也能表示指针。



#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif /* NULL */


### 3.2 范围for


在 C++中 for 循环可以使用基于范围的 for 循环,示例代码如下:



int main()
{
int a[] = { 1, 2, 3, 4, 5, 6 };

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

[外链图片转存中…(img-XhDJK323-1714854160193)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值