杂项:想到了就写一下

  • 在对 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
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值