今天看啥
    热点:

      天发国际娱乐官网:该《意见》提出,到2020年末,甘肃省中(藏)药材种植面积达到40万亩,其中标准化种植面积达到50%;中(藏)药材加工率达到60%,藏药中成药产量达到100吨;培育3-5家主营业务收入亿元以上的龙头企业,5-10个藏药中成药大品种和名牌产品,力争甘肃省藏区中(藏)药产值达到10亿元以上。

      C++ vector::erase和无参构造函数的调用(代码教程),vectorerase


      vector::erase

      C++ vector的元素删除,源码是这样的:

      template <class _Tp, class _Allocator>
      inline _LIBCPP_INLINE_VISIBILITY
      typename vector<_Tp, _Allocator>::iterator
      vector<_Tp, _Allocator>::erase(const_iterator __position)
      {
      #if _LIBCPP_DEBUG_LEVEL >= 2
          _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
              "vector::erase(iterator) called with an iterator not"
              " referring to this vector");
      #endif
          _LIBCPP_ASSERT(__position != end(),
              "vector::erase(iterator) called with a non-dereferenceable iterator");
          difference_type __ps = __position - cbegin();
          pointer __p = this->__begin_ + __ps;
          this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
          this->__invalidate_iterators_past(__p-1);
          iterator __r = __make_iter(__p);
          return __r;
      }

      可知,C++将被删除部分的后面所有元素作为一个集合向前移动了。

      所以,假设我们需要清空元素,不要这样写:

      int main()
      {
          vector<int> v_int;
          for(int i=0;i<10;i++){
              v_int.push_back(i+1);
          }
          int size = v_int.size();
          vector<int>::iterator it = v_int.begin();
          while(size--) {
              cout<<*it<<" ";
              v_int.erase(it++);   // attention !
              cout<<"size: "<<v_int.size()<<endl;
          }
          return 0;
      }

      它得到结果是这样的:

      1 size: 9
      3 size: 8
      5 size: 7
      7 size: 6
      9 size: 5

      将例子中的it++改成it即可,那样才能清空所有的元素。

      无参构造函数的调用

      形如Base instance()会调用类的无参构造函数吗?

      答案是否定的,C++会将其解释成返回Base对象的函数。

      #include <iostream>
      #include <vector>
      #include <string>
      using namespace std;
      
      class Base{
      public:
          Base(){ cout<<"Base()..\n"; }
          Base(string str){ cout<<str<<endl; }
          ~Base(){ cout<<"~Base().. \n"; }
      };
      
      int main()
      {
          //Base ins(); //empty parentheses interpreted as a function declaration
          Base ins;     //ok
          Base ins2("hello world");  //ok
          return 0;
      }

      不过有意思的是,有参构造函数却是可以被这样调用的。

      有时,我们会遇到这样的函数:

      void show(const Base &b){
          //...
      }

      需要给该函数传递一个存储在栈中的变量,要构造这样的变量,我们可以简单地这样写Base(). 它等价于Base b.

      即:

          //show(Base("hello"));  //ok. output: hello     it's equal to 'Base b("hello"); show(b);'
          //show(Base());         //ok. output: Base()..  it's equal to 'Base b; show(b);'

      www.1click-soft.comtruehttp://www.1click-soft.com/cjjc/1304364.htmlTechArticleC++ vector::erase和无参构造函数的调用(代码教程),vectorerase vector::erase C++ vector的元素删除,源码是这样的: template class _Tp, class _Allocator...

      相关文章

      帮客评论

      视觉看点
      百度 360 搜狗