zoukankan      html  css  js  c++  java
  • C++的vector学习abc

    开始学习和使用vector了,用到之后再去学似乎神迹的感觉啊,就像跑一下就能给个糖吃哈哈

    百度上的六种初始化的方法就不再说了,那些方法都很对。

    如果没有值初始化,系统会自行初始化,目前我遇到的是用脚标初始化123456789...

    只是不符合我的用户需求哈哈

    首先,头文件

    #include<vector>
    

     然后,定义一个vector

    vector<int> a;
    

     这里,这个a可以用六种初始化的方法把它初始化了,但是我这里不用。我开始以为一定要初始化来申请内存,后来发现并不用,它在push_back的时候就会申请了。这样

    for (int k=0 ; k<10;k++)
      a.push_back(b[k]);
    

     看别人的代码时候,用a[k] = b[k];类似的方法赋值,但是我这里运行是失败的,到底能不能这样写还不确定。。

    遍历是用了它自带的函数

    for( vector<int>::iterator iter = a.begin();iter != a.end(); ++iter, ++i )
    {  
      c[i] = *iter;
    }
    

    因此一般的vector遍历方法如下

    size_t i=0;
    for(vector<double>::iterator iter = current_view.begin();iter != current_view.end(); ++iter, ++i )
    {  
      cout<<*iter;
    }
    

     vector不能用下标直接访问赋值,否则它得到的是下标值。

    可以用下标值去访问已经存在的值。

    //初学C++的程序员可能会认为vector的下标操作可以添加元素,其实不然:
    vector<int> ivec;   // empty vector
    for (vector<int>::size_type ix = 0; ix != 10; ++ix)
         ivec[ix] = ix; // disaster: ivec has no elements
    //上述程序试图在ivec中插入10个新元素,元素值依次为0到9的整数。但是,这里ivec是空的vector对象,而且下标只能用于获取已存在的元素。
    //这个循环的正确写法应该是:
    for (vector<int>::size_type ix = 0; ix != 10; ++ix)
         ivec.push_back(ix); // ok: adds new element with value ix
    //警告:必须是已存在的元素才能用下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。仅能对确知已存在的元素进行下标操作 

    vector的空间会累计,不清空它会在前值之后赋值,因此,清空并且消除内存空洞like this:

    current_view.clear();//这句话好像并没有太刻意的功能,反正我没有发现
    vector<double>(current_view).swap(current_view);

    以上,基本用法

    附:

    #include<iostream>
    #include<vector>
    int j;
    using namespace std;
    
    int main (int argc, char **argv)
    {
     vector<int> a;
     int b[10] = {9};
     cout<<"输入数 : "<<endl;
     for (int k=0 ; k<10;k++)
       a.push_back(b[k]);
     int *c=new int[a.size()];
     size_t i=0;
    
     for( vector<int>::iterator iter = a.begin();iter != a.end(); ++iter, ++i )
     {  
       c[i] = *iter;
     }
     for ( j = 0; j < a.size(); ++j)
     cout << *(c + j) <<endl;
    
     delete [] c;
     return 0;
    }
    

    另附:

    vector对象最重要的几种操作
    1. v.push_back(t)  在容器的最后添加一个值为t的数据,容器的size变大。另外list有push_front()函数,在前端插入,后面的元素下标依次增大。
    2. v.size()        返回容器中数据的个数,size返回相应vector类定义的size_type的值。v.resize(2*v.size)或 v.resize(2*v.size, 99) 将v的容量翻倍(并把新元素的值初始化为99)
    3. v.empty()       判断vector是否为空
    4. v[n]            返回v中位置为n的元素
    5. v.insert(pointer,number, content)    向v中pointer指向的位置插入number个content的内容。还有v. insert(pointer, content),v.insert(pointer,a[2],a[4])将a[2]到a[4]三个元素插入。
    6. v.pop_back()    删除容器的末元素,并不返回该元素。
    7. v.erase(pointer1,pointer2)     删除pointer1到pointer2中间(包括pointer1所指)的元素。vector中删除一个元素后,此位置以后的元素都需要往前移动一个位置,虽然当前迭代器位置没有自动加1,但是由于后续元素的顺次前移,也就相当于迭代器的自动指向下一个位置一样。
    8. v1==v2 判断v1与v2是否相等。 9. !=、<、<=、>、>= 保持这些操作符惯有含义。 10. vector<typeName>::iterator p=v1.begin( ); p初始值指向v1的第一个元素。*p取所指向元素的值。 对于const vector<typeName>只能用vector<typeName>::const_iterator类型的指针访问。 11. p=v1.end( ); p指向v1的最后一个元素的下一位置。 12. v.clear() 删除容器中的所有元素。
    c.assign(beg,end)将[beg; end)区间中的数据赋值给c。
    c.assign(n,elem)将n个elem的拷贝赋值给c。 
    c.at(idx)传回索引idx所指的数据,如果idx越界,抛出out_of_range。
    c.back()传回最后一个数据,不检查这个数据是否存在。
    c.front()传回地一个数据。
    get_allocator使用构造函数返回一个拷贝。
    c.rbegin()传回一个逆向队列的第一个数据。 
    c.rend()传回一个逆向队列的最后一个数据的下一个位置。
    c.~ vector <Elem>()销毁所有数据,释放内存。

    青山不改绿水依旧,下个见

  • 相关阅读:
    java Thread和Runnable区别
    java sleep() 、yield()
    Java Thread.join()方法
    内存管理_深入剖析volatile关键字
    内存管理_JAVA内存管理
    内存管理_原子性、可见性、有序性
    小程序wx.showToast()方法实现文字换行
    常用表单校验(手机号、固话、身份证、真是姓名、邮箱、银行卡)
    通过CSS实现 文字渐变色 的两种方式
    substring和substr的区别
  • 原文地址:https://www.cnblogs.com/feixiao5566/p/4699759.html
Copyright © 2011-2022 走看看