🐶博主主页: @ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列: 线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++
🔥座右铭:"不要等到什么都没有了,才下定决心去做"
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
[使用 auto 关键字可以让编译器自动推导变量的类型](#使用 auto 关键字可以让编译器自动推导变量的类型)
[在使用容器的迭代器时,可以使用 auto 简化类型声明](#在使用容器的迭代器时,可以使用 auto 简化类型声明)
[auto 也可以用于推导比较复杂的类型](#auto 也可以用于推导比较复杂的类型)
[decltype 会保留表达式中的引用类型](#decltype 会保留表达式中的引用类型)
列表初始化
在C++11中,引入了一种称为列表初始化(List Initialization)的新特性,它提供了一种统一的初始化语法,可以用于各种初始化操作,包括对象、数组、结构体等。列表初始化使用花括号
{}
来构造初始化列表。下面是列表初始化的几种常见用法:
对象初始化
cppint x{5}; // 初始化整数变量 x 为 5 int x={5};//也可以这样 std::string str{"Hello"}; // 初始化字符串对象为 "Hello" std::string str={"Hello"};
数组初始化
cppint arr[]{1, 2, 3, 4, 5}; // 初始化整型数组 std::vector<int> vec{1, 2, 3}; // 初始化整型向量
自定义类型初始化
cppstruct Point { int x; int y; }; Point p{3, 4}; // 初始化 Point 结构体对象
嵌套式初始化
cppstd::vector<std::vector<int>> matrix{{1, 2}, {3, 4}, {5, 6}}; // 初始化二维向量
new表达式初始化
cppvector<int>* p1=new vector<int>(2);//new原来初始化的方式 vector<int>* p2=new vector<int>{2};
列表初始化的优点之一是它具有更加严格的类型检查,可以避免一些隐式类型转换导致的问题。此外,它也可以用于在声明时进行初始化,提高了代码的可读性和简洁性。
initializer_list
initializer_list 是C++11引入的一种特殊类型,它可以用来初始化类的成员变量或函数的参数列表。它本质上是一个包含了指定数量元素的数组,但它与普通的数组不同之处在于,它可以作为函数参数传递,而且可以自动推断元素的类型。
cppint main() { auto il = { 10, 20, 30 }; cout << typeid(il).name() << endl; return 0; } vector<int> v1{1,2,3};//{1,2,3}会被编译器识别为initializer_list类型,然后通过vector构造函数去初始化v1 map<string,string> map1{{"sort","排序"},{"left","左边"}};
auto
auto
是一种类型推导关键字,它允许编译器自动推导变量的类型。使用auto
声明的变量的类型会根据其初始化表达式的类型来推导使用
auto
关键字可以让编译器自动推导变量的类型
cppauto x = 5; // 推导为 int 类型 auto y = 3.14; // 推导为 double 类型 auto ptr = new MyClass(); // 推导为指向 MyClass 类型的指针
在使用容器的迭代器时,可以使用
auto
简化类型声明
cppstd::vector<int> v1 = {1, 2, 3, 4, 5}; auto it=v1.begin()//auto自动推导类型,这里的类型是std::vector<int>::iterator
auto
也可以用于推导比较复杂的类型
cppauto lambda = [](int x, int y) { return x + y; }; // 推导 lambda 表达式类型
使用auto遍历
遍历数组
cppint a[]={9,0,1}; for(auto e:a) { cout<<e<<endl; }
遍历vector
cppvector<int> v4(1,23); for(auto e:v4) { cout<<e<<endl; }
auto除了可以遍历数组,还可以遍历c++中的容器(只要容器有迭代器,我们就可以遍历,我们自定义的类型,如果迭代器,也可以用auto遍历)
decltype
decltype
是 C++11 中的一个关键字,用于获取表达式的类型,而不实际计算该表达式的值。它可以用于获取变量、表达式或函数返回值的类型,而无需显式指定类型decltype使用语法
cppdecltype(expression)
其中
expression
是要获取类型的表达式或变量。获取变量类型
cppint x = 5; decltype(x) y; // 推导出变量 x 的类型,即 int
获取表达式类型
cppint x = 5; double y = 3.14; decltype(x + y) result; // 推导出表达式 x + y 的类型,即 double
获取函数值返回类型
cppint add(int a, int b) { return a + b; } decltype(add(1, 2)) sum; // 推导出函数 add 的返回值类型,即 int
decltype
会保留表达式中的引用类型
cppint x = 5; int& ref = x; decltype(ref) z = x; // 推导出变量 ref 的类型,即 int&
array
在C++中,std::array 是一个标准库容器,表示固定大小的数组。与传统的C数组相比,std::array 提供了更多的功能和安全性,例如可以通过成员函数获取数组的大小,支持迭代器和范围循环,以及提供了一些操作数组的成员函数。
array的新增使用来弥补C语言数组不足的,例如
cpparray<int,5> a1;//array类型 int a2[5];//数组 a1[5]会报错 a2[5]不会报错
array相较于vector于就显得多余了,vector功能更加的强大
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸