-
在对 stl 容器使用普通 for 循环进行遍历,如果不需要改变容器大小,循环结束条件应该是 i < vec.size() 还是其它?
通过查询 vector::size() 源码可知:每调用一该方法就会计算一次容器的大小._NODISCARD size_type size() const noexcept { // return length of sequence auto& _My_data = _Mypair._Myval2; return static_cast<size_type>(_My_data._Mylast - _My_data._Myfirst); }
因此应该在循环之前获取容器的大小,以用于循环结束条件的判断。否则每次判断循环是否结束时都要计算一次容器大小,从而造成了资源浪费:
std::vector<int> vec_nums{ 1, 2, 3, 4, 5, 6, 7, 8 }; int vec_size = vec_nums.size(); for (int i = 0; i < vec_size; ++i) { std::cout << vec_nums[i] << std::endl; }
实际应用中更推荐使用基于范围的 for 循环或迭代器进行遍历。
-
条件判断时为什么判断值应该写在相等符号左侧?
判断值一般时不能赋值的,将判断值写在等于号左侧,能避免在少写一个 “=” 时依然能够通过编译。 -
重命名的两种方式 using(C++11 新增)和 typedef
-
使用
// typedef typedef struct _MyStruct { int n; char c; } MyStruct; // using using MyMapIter = std::map<int, std::string>::iterator;
-
区别
- using 更加利于代码阅读。
- C++11 标准更推荐 using.
- 模板中可以直接使用 using 不能直接使用 typedef。
// 下面的代码编译时将会报错 template <typename T> typedef MyVector<T, MyAlloc<T>> Vec; Vec<int> vec; // error // 包装一层后可以使用,但是比较麻烦,并不美观 template <typename T> struct Vec { typedef MyVector<T, MyAlloc<T>> type; }; Vec<int>::type vec; // ok
-
杂项:想到了就写一下
于 2021-09-25 10:52:59 首次发布