美文网首页
C++ vector使用

C++ vector使用

作者: windistance | 来源:发表于2019-07-10 20:35 被阅读0次

    vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器。它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的。

    构造vector对象

    vector 是C++ STL的一个重要成员,使用它时需要包含头文件: #include<vector>

    
    vector<int> a;           //无参数 - 构造一个空的vector,
    vector<int> a(10);       //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
    vector<int> a(10,1);     //定义了10个整型元素的向量,且给出每个元素的初值为1
    vector<int> a(b);        //用b向量来创建a向量,整体复制性赋值, 拷贝构造
    vector<int> v3=a ;       //移动构造
    vector<int> a(b.begin(),b.begin+3);   //定义了a值为b中第0个到第2个(共3个)元素
    int b[7]={1,2,3,4,5,9,8};
    vector<int> a(b,b+6);    //从数组中获得初值,b[0]~b[5]
    

    基本操作-属性获取/调整

    1 vec.empty-判断vec是否为空

    a.empty()
    

    2 vec.size-元素的个数

    a.size()
    

    3 vec.capacity-实际存储空间

    a.capacity()
    

    4 vec.resize-调整大小

    a.resize(10);        //将a的现有元素个数调至10个,多则删,少则补,其值随机
    a.resize(10, 2);      //将a的现有元素个数调至10个,多则删,少则补,其值为2
    

    5 vec.reserve-重新分配空间

    a.reserve(100);      //将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能),但是最大值不可以大于max_size的值,否则会抛出异常
    

    6 比较操作符

    a==b;     //b为向量,向量的比较操作还有!=,>=,<=,>,<
    

    基本操作-增加元素

    1 vec.push_back()-尾部插入元素

    在容器的最后一个位置插入元素x,如果size值大于capacity值,则将重新分配空间

    函数:

    void push_back (const value_type& val);
    void push_back (value_type&& val);
    
    // vector::push_back
    #include <iostream>
    #include <vector>
    
    int main ()
    {
      std::vector<int> myvector;
      int myint;
    
      std::cout << "Please enter some integers (enter 0 to end):\n";
    
      do {
        std::cin >> myint;
        myvector.push_back (myint);
      } while (myint);
    
      std::cout << "myvector stores " << int(myvector.size()) << " numbers.\n";
    
      return 0;
    }
    

    2 vec.insert()-插入元素

    第一个函数,在迭代器指定的位置前插入值为x的元素

    第二个函数,在迭代器指定的位置前插入n个值为x的元素

    第三个函数,在迭代器指定的位置前插入另外一个容器的一段序列迭代器first到last

    若插入新的元素后总得元素个数大于capacity,则重新分配空间

    a.insert(a.begin()+1, 5);         //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
    a.insert(a.begin()+1, 3,5);       //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
    a.insert(a.begin()+1,b+3, b+6);   //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8
    
    // inserting into a vector
    #include <iostream>
    #include <vector>
    
    int main()
    {
        std::vector<int> myvector(3, 100);
        std::vector<int>::iterator it;
    
        it = myvector.begin();
        it = myvector.insert(it, 200);
    
        myvector.insert(it, 2, 300);
    
        // "it" no longer valid, get a new one:
        it = myvector.begin();
    
        std::vector<int> anothervector(2, 400);
        myvector.insert(it + 2, anothervector.begin(), anothervector.end());
    
        int myarray[] = { 501,502,503 };
        myvector.insert(myvector.begin(), myarray, myarray + 3);
    
        std::cout << "myvector contains:";
        for (it = myvector.begin(); it < myvector.end(); it++)
            std::cout << ' ' << *it;
        std::cout << '\n';
    
        system("PAUSE");
        return 0;
    }
    

    基本操作-删除元素

    1 vec.erase-删除

    iterator erase (const_iterator position);//删除指定位置元素,返回迭代器
    //例如:a.erase(a.begin()+1)
    
    iterator erase (const_iterator first, const_iterator last);//删除指定迭代器中间的元素,左闭右开
    //例如:a.erase(a.begin()+1, a.begin()+3);
    

    2 vec.clear-清空vec中的元素

    将容器里的内容清空,size值为0,但是存储空间没有改变

    a.clear();
    

    3 vec.pop_back-删除尾部元素

    a.pop_back();         //删除a向量的最后一个元素
    

    基本操作-查找/修改元素

    1 vec.assign-重新赋值

    将丢弃原来的元素然后重新分配元素,第一个函数是使用迭代器,第二个函数是使用4个元素,每个元素的值为2

    a.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给a
    a.assign(4,2);        //是a只含4个元素,且每个元素为2
    

    2 vec.back-返回vec的最后一个元素

    返回尾部元素的值,与end()函数有区别,back()函数返回的是尾部元素的迭代器

    vec.back()
    

    3 vec.front-返回vec的第一个元素

    返回第一个元素的值,与begin()函数有区别,begin()函数返回的是第一个元素的迭代器

    vec.front()
    

    4 vec[i]-下标访问修改

    // vector::operator[]
    #include <iostream>
    #include <vector>
    
    int main ()
    {
      std::vector<int> myvector (10);   // 10 zero-initialized elements
    
      std::vector<int>::size_type sz = myvector.size();
    
      // assign some values:
      for (unsigned i=0; i<sz; i++) myvector[i]=i;
    
      // reverse vector using operator[]:
      for (unsigned i=0; i<sz/2; i++)
      {
        int temp;
        temp = myvector[sz-1-i];
        myvector[sz-1-i]=myvector[i];
        myvector[i]=temp;
      }
    
      std::cout << "myvector contains:";
      for (unsigned i=0; i<sz; i++)
        std::cout << ' ' << myvector[i];
      std::cout << '\n';
    
      return 0;
    }
    

    5 at-访问元素

    在函数的操作方面和下标访问元素一样,不同的是当这个函数越界时会抛出一个异常out_of_range

    // vector::at
    #include <iostream>
    #include <vector>
    
    int main ()
    {
      std::vector<int> myvector (10);   // 10 zero-initialized ints
    
      // assign some values:
      for (unsigned i=0; i<myvector.size(); i++)
        myvector.at(i)=i;
    
      std::cout << "myvector contains:";
      for (unsigned i=0; i<myvector.size(); i++)
        std::cout << ' ' << myvector.at(i);
      std::cout << '\n';
    
      return 0;
    }
    

    6 swap-交换

    交换这两个容器的内容,这涉及到存储空间的重新分配

    // swap vectors
    #include <iostream>
    #include <vector>
    
    int main ()
    {
      std::vector<int> foo (3,100);   // three ints with a value of 100
      std::vector<int> bar (5,200);   // five ints with a value of 200
    
      foo.swap(bar);
    
      std::cout << "foo contains:";
      for (unsigned i=0; i<foo.size(); i++)
        std::cout << ' ' << foo[i];
      std::cout << '\n';
    
      std::cout << "bar contains:";
      for (unsigned i=0; i<bar.size(); i++)
        std::cout << ' ' << bar[i];
      std::cout << '\n';
    
      return 0;
    }
    

    基本操作-迭代器

    1 vec.begin/vec.end-迭代器

    // vector::begin/end
    #include <iostream>
    #include <vector>
    
    int main ()
    {
      std::vector<int> myvector;
      for (int i=1; i<=5; i++) myvector.push_back(i);
    
      std::cout << "myvector contains:";
      for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)
        std::cout << ' ' << *it;
      std::cout << '\n';
    
      return 0;
    }
    

    2 vec.cbegin/vec.cend-常量迭代器

    返回一个类型为cont::const_iterator 的对象

    
    // vector::cbegin/cend
    #include <iostream>
    #include <vector>
    
    int main ()
    {
      std::vector<int> myvector = {10,20,30,40,50};
    
      std::cout << "myvector contains:";
    
      for (auto it = myvector.cbegin(); it != myvector.cend(); ++it)
        std::cout << ' ' << *it;
      std::cout << '\n';
    
      return 0;
    }
    

    算法操作

    需要头文件#include<algorithm>

    1 sort-排序

    sort(a.begin(),a.end());     //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列
    

    2 reverse-翻转

    使用reverse将元素翻转

    reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1
    

    3 copy-复制

    copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开        始复制,覆盖掉原有元素
    

    4 find-查找

    find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置
    

    常用操作

    使用迭代器遍历容器

    vector<int>::iterator it;
    for(it=vec.begin();it!=vec.end();it++){
    vec[it]=0;
    }
    

    auto遍历

    for (auto& x : vec)
            std::cout << ' ' << x;
    

    参考

    http://www.cplusplus.com/reference/vector/vector/

    https://blog.csdn.net/happy987818/article/details/54944132

    相关文章

      网友评论

          本文标题:C++ vector使用

          本文链接:https://www.haomeiwen.com/subject/vnthkctx.html