C++新特性 迭代器及类型推导
2022/7/25 14:23:23
本文主要是介绍C++新特性 迭代器及类型推导,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.1 迭代器
stl 中存在一些常见的已经封装好(开箱即用)数据结构相关的模板类,例如 vector(动态数组)、list(链表)、stack(栈)、queue(队列)、map(hash表/红黑树)等,这些类通常都有一些最基本的操作,例如:增加、删除、修改、遍历等等。
C++ 为了方便统一,采用了设计模式中的迭代器模式,也就是统一地提供了一种方法顺序访问一个聚合对象的各种元素,而又不暴露该对象的内部表示,我们一般对这些数据结构的遍历都可以无脑使用迭代器,而不关心内部存储的差异。
#include <iostream> #include <numeric> #include <vector> #include <string> #include <list> int main(int argc, char const *argv[]) { // 普通的数组, 一旦申请不能再扩增 int arry[5] = { 1, 2, 3, 4, 5}; for (int i = 0; i < sizeof(arry)/sizeof(arry[0]); i++) { std::cout << arry[i] << std::endl; } int* pArry = new int[5]; // 容器---动态数组 不用指定其大小,会根据数组当前的使用情况进行动态的扩容 // 模板类型 std::vector<int> v; // 插入数据 v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); for (int i = 0; i < v.size(); ++i) { std::cout << v[i] << std::endl; } // 使用迭代器方式遍历数组 std::vector<int>::iterator it; // 迭代器,模板类中的内部类 for (it= v.begin(); it != v.end(); it++) { std::cout << *it << std::endl; // *it 来访问模板类的具体的值 } // 统一的遍历方式 链表 std::list<std::string> l; l.push_back("hello1"); l.push_back("hello2"); l.push_back("hello3"); for (std::list<std::string>::iterator it2 = l.begin(); it2 != l.end(); it2++) { std::cout << *it2 << std::endl; // *it2 来访问模板类的具体的值 } }
在传统 C 和 C++ 中,参数的类型都必须明确定义,这其实对我们快速进行编码没有任何帮助,尤其是当我们面对一大堆复杂的模板类型时,必须明确的指出变量的类型才能进行后续编码,这不仅拖慢我们的开发效率,也让代码变得又臭又长。
C++11 引入 auto
和 decltype
这两个关键字实现了类型推导,让编译器来操心变量的类型。这使得 C++ 也具有了和其他现代编程语言一样,某种意义上提供了无需操心变量类型的使用习惯。
1.2 auto
auto
在很早以前就已经进入了 C++,但是他始终作为一个存储类型的指示符存在,与 `register并存。在传统 C++ 中,如果一个变量没有声明为
register变量, 将自动被视为一个
auto变量,而随着
regsiter被弃用,对
auto` 的语义变更也就非常自然了。
使用 auto
进行类型推导的一个最为常见而且效果显著的例子就是迭代器。在以前我们需要这样来书写一个迭代器遍历:
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++);
而有了 auto
之后可以:
for (auto it = vec.begin(); it != vec.end(); it++);
一些其他的常见用法:
auto i = 5; // i 被推导为 int auto arr = new auto(10) // arr 被推导为 int * ```C++ int add(auto x, auto y);
此外,auto
还不能用于推导数组类型:
#include <iostream> int main() { auto i = 5; int arr[10] = { 0 }; auto auto_arr = arr; }
还有一种更为方便的遍历写法
for (auto s : vec); for (auto &s : vec);
这篇关于C++新特性 迭代器及类型推导的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享