C++语法基础--标准库类型--vector

1.头文件:
      #include<vector>


2.vector不是一种数据类型,而只是一个模板。但vector<int>,vector<string>......则是数据类型
  原型:
      template<class T,class Allocator = std::allocator<T>> 
         class vector;



3.常用构造函数
   原型:
   default:
        explicit vector (const allocator_type& alloc = allocator_type());
   fill :
        explicit vector (size_type n, const value_type& val = value_type(),
                          const allocator_type& alloc = allocator_type());
   range :
          template <class InputIterator>
              vector (InputIterator first, InputIterator last,
                      const allocator_type& alloc = allocator_type());
  copy :
         vector (const vector& x);



 eg:
  vector<int> vec1;                                
  vector<int> vec2 (5,9);                      
// 99999
  vector<int> vec3(vec2.begin(),vec2.end());  // 99999
  vector<int> vec4 (vec3);                    //99999


  int arr[] = {1,2,3,4,5};
  vector<int> vec5 (arr, arr + sizeof(arr) / sizeof(int) ); // 1 2 3 4 5


4.值得初始化
  *内置类型,取决于存储在vector中的元素的数据类型,(例如,int类型,这初始化为0)
  *类类型,用该类的默认构造函数初始化
   eg:
      vector<int> vec1(10);
 //10的元素都为0
      vector<string> vec2(10);  //调用string的默认构造函数10个元素都为空串


5.vector常用方法
   *empty(),size(),operator[]       //类似string类型操作,事实上大部分标准库类型都一样
    *push_back():
      将元素添加到尾部


      原型:
          void push_back( const T& value );

   eg:
       vector<int> vec;
         vec.push_back(1);

   *pop_back()
      删除最后一个元素 
        原型:
           void pop_back();

   *capacity()
     返回容器的容量
        原型:
           size_type capacity() const;

   *reserve: 
     分配空间,更改capacity但不改变size
         原型:
           void reserve (size_type n);
   * resize: 
      分配空间,更改capacity也改变size
         原型:
           void resize (size_type n, value_type val = value_type())

 eg:
    int main()
  {
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
for(int i=0;i<vec.size();i++)

cout<<vec[i]<<endl;
//输出1,2,3,4
}


vec.pop_back();//vec弹出最后一个,


for(int i=0;i<vec.size();i++)

cout<<vec[i]<<endl; //输出1,2,3
}


vec.reserve(1);           //vec依然是1,2,3
        cout<<vec[2]<<endl;  //ok
vec.resize(1);              //vec被截断,只剩下1
cout<<vec[2]<<endl;  //error

        return 0;
   }


   
   *=,!=,==,<,<=,>,>=          //保持这些操作的惯有语义


6.两个vector容器比较:所有元素相等而且两个容器含有相同数目的元素,则两个容器相等,否则,第一个不相等元素的比较决定了两个容器的大小


7.放入容器的类型有三个限制:(实际上它们只适用于用户自定义的类类型,因为所以预定义数据类型,包括指针,都满足这些限制)
    * 元素类型必须支持等于操作符
    *元素类型必须支持小于操作符
    *元素类型必须支持缺省值(默认构造函数)
   解析:
       以上三点说明,只要满足:自定义的类型重载了==,<操作符且有默认构造函数,就可以用到vector所支持的操作符,而没有必要再重载!=,>....之类的操作符。当然了,如够你只需用到==操作符,就只需重载==操作符,而没必要再重载其它操作符。

    eg:
         class A
       {
         public:
    A(int){}
        };


      A a(3);
      vector<A> vec(3);
//error,无法调用A的默认构造函数
   
 eg:
      class A
    {
        public: 
             A(){}
             A(int val):x(val){}
      friend bool operator == (const A& one, const A& two)
           {
             return (one.x == two.x) ;
           } 
      /*
       *
如为成员函数,需为const,否则出错
       * bool operator==(const A& other)const
       * {
       *    return x==other.x;
       *  }
       *
       */
     friend bool operator < (const A& one, const A& two)
          {
             return (one.x < two.x) ;
           }   
        private:
             int x;


      };


  int main ()
 {
   A a(1),b(2);
   vector<A> vec1;
   vector<A> vec2;
   vec1.push_back(a);
   vec2.push_back(b);
   cout<<(vec1==vec2)<<endl; //0
   cout<<(vec1<vec2)<<endl; //1
   cout<<(vec1>vec2)<<endl;  //0  注意:自定义的类型A并没有重载此操作符,下同
   cout<<(vec1!=vec2)<<endl; //1
   cout<<(vec1<=vec2)<<endl; //1
   cout<<(vec1>=vec2)<<endl;  //0
   return 0;
 }




8.迭代器(iterator)
  begin(),end(), 
    * iterator
      eg:
         vector<int>::iterator

   *const_iterator
      eg:
         vector<int>::const_iterator
//只允许以只读方式访问容器底层元素
     注意:const_iterator并不等于const iterator
      eg:
        vector<string> vec;
        vector<string>::const_iterator it=vec.begin();
        ++it;    
//ok
const vector<string>::iterator it1=vec.begin();
    ++it1;     //error  it1不能改变,只能指向vec.begin()
   
  int main()
{
int arr[4]={1,2,3};
vector<int> vec(arr,arr+3);
for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
return 0;
}
   
  
9.迭代器的算术操作(类似于指针)
   *iterator+n 
   *iterator-n
   *iterator1-iterator2
   注意:iterator1+iterator2 //error   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值