【C++】STL之vector容器(定义及基本函数应用)

目录

一、什么是vector?

二、容器特性

1.顺序序列

2.动态数组

3.能够感知内存分配器的(Allocator-aware)

三、基本函数实现

1.构造函数

2.修改函数

① assign

② push_back  

③ pop_back 

④ insert

⑤ erase

⑥ swap

⑦ clear

3.元素访问

① operator[]

② at

③ data 

④ front 

⑤ back

4.迭代器

① begin

② end

③ rbegin 

④ rend 

5.容量

① size

② max_size 

③ capacity

④ reserve 

⑤ resize

四、实例演示

1.一维数组的定义及访问(直接数组访问&迭代器访问)

2.pop_back()&push_back(elem)实例在容器最后移除和插入数据

3.insert()&erase(elem)实例在容器任意位置插入和移除数据

4.clear()清除容器中所有数据

5.排序函数sort()和逆序函数reverse()

6.二维数组的定义


一、什么是vector?

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。


二、容器特性

1.顺序序列

顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

2.动态数组

支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。

3.能够感知内存分配器的(Allocator-aware)

容器使用一个内存分配器对象来动态地处理它的存储需求。


三、基本函数实现

1.构造函数

  • vector():创建一个空vector
  • vector(int nSize):创建一个vector,元素个数为nSize
  • vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
  • vector(const vector&):复制构造函数
  • vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
    vector first;//创建一个值类型为int的空vector
    
    vector second(10);//创建一个10个int的vector,且每个元素初值为0
    
    vector third(10,1);//创建一个10个int的vector,且每个元素初值为1
    
    vector forth(third);//将vector third 拷贝给vector forth ,两者元素值完全相同
    
    vector fifth(third.begin(),third.end()-5);
    //将third [third.begin(),third.end()-5)区间的元素赋给fifth
    
    //从数组中获得初值
    int b[7]={1,2,3,4,5,6,7};
    vector a(b,b+7);

 

2.修改函数

【C++】STL之vector容器(定义及基本函数应用)_第1张图片

① assign

作用:将新内容赋给vector,替换其当前内容,并相应地修改其大小。

  std::vector first;
  std::vector second;
  std::vector third;

  first.assign (7,100);             // 7 ints with a value of 100

  std::vector::iterator it;
  it=first.begin()+1;

  second.assign (it,first.end()-1); // the 5 central values of first

  int myints[] = {1776,7,4};
  third.assign (myints,myints+3);   // assigning from array.
② push_back  

作用:在vector当前最后一个元素的末尾添加一个新元素。val的内容被复制(或移动)到新元素中。

将容器大小增加了1,当且仅当新vector大小 > 当前vector容量时,会自动重新分配存储空间。

   std::vector myvector(5,1);
   myvector.push_back (5);
③pop_back 

 作用:移除vector中的最后一个元素,有效地将容器大小减小1。

  std::vector myvector;
  int sum (0);
  myvector.push_back (100);
  myvector.push_back (200);
  myvector.push_back (300);

  while (!myvector.empty())
  {
    sum+=myvector.back();
    myvector.pop_back();
  }
④ insert

【C++】STL之vector容器(定义及基本函数应用)_第2张图片

 作用:通过在指定位置的元素之前插入新元素来扩展vector,从而通过插入元素的数量有效地增加容器的大小


  std::vector myvector (3,100); //100 ,100 ,100
  std::vector::iterator it;

  it = myvector.begin();
  it = myvector.insert ( it , 200 );//200 ,100 100 ,100

  myvector.insert (it,2,300);       //300,300,200,100,100


  it = myvector.begin();

  std::vector anothervector (2,400);
  myvector.insert (it+2,anothervector.begin(),anothervector.end());
                                     //300,300.400,400,200,100.100

  int myarray [] = { 501,502,503 };
  myvector.insert (myvector.begin(), myarray, myarray+3);
                                    //501,502,503,300,300.400,400,200,100.100
⑤ erase

 作用: 从vector对象中移除单个元素(position)或一段元素([first,last))

  std::vector myvector;

  for (int i=1; i<=10; i++) 
  {
      myvector.push_back(i);
  }   //1,2,3,4,5,6,7,8,9,10
 
  myvector.erase (myvector.begin()+5);//删除第6个元素
       //1,2,3,4,5,7,8,9,10

  myvector.erase (myvector.begin(),myvector.begin()+3);//删除前三个元素(左闭右开区间)
       //4,5,7,8,9,10
⑥ swap

作用:用x的内容交换容器的内容,x是另一个相同类型的vector对象。大小可能不同。

std::vector foo (3,100);   // foo={ 100,100,100}
std::vector bar (5,200);   // bar={200,200,200,200,200}

foo.swap(bar);
//foo={200,200,200,200,200}
//bar={ 100,100,100}
⑦ clear

作用:从vector中移除所有元素(这些元素被销毁),使容器的大小为0。

  std::vector myvector;
  myvector.push_back (100);
  myvector.push_back (200);
  myvector.push_back (300); // myvector={100,200,300}

  myvector.clear();// myvector={}
  myvector.push_back (1101);
  myvector.push_back (2202);// myvector={1101,2202}

 

3.元素访问

【C++】STL之vector容器(定义及基本函数应用)_第3张图片

① operator[]

 作用:返回对vector容器中位置n的元素的引用。类似于数组访问

② at

 作用:返回对vector中位置n的元素的引用。

【注意】该函数自动检查n是否在vector中有效元素的范围内,如果不在,则抛出out_of_range异常(即,如果n大于或等于其大小)。这与成员操作符[]相反,它不检查边界。

 std::vector myvector (10);   // myvector={0,0,0,0,0,0,0,0,0,0}

  // assign some values:
  for (unsigned i=0; i
③ data 

作用:返回一个直接指针,指向vector内部用来存储其元素的内存数组。

  std::vector myvector (5); //myvector={0,0,0,0,0}

  int* p = myvector.data();

  *p = 10; //myvector={10,0,0,0,0}
  ++p;
  *p = 20; //myvector={10,20,0,0,0}
  p[2] = 100; //myvector={10,20,0,100,0}
④ front 

作用: 返回对vector中第一个元素的引用。

【注意】与返回指向同一元素的迭代器的成员vector::begin不同,此函数返回直接引用

空容器上调用此函数会导致未定义行为

  std::vector myvector;

  myvector.push_back(78);
  myvector.push_back(16);

  // now front equals 78, and back 16

  myvector.front() -= myvector.back();
⑤ back

 作用:返回对vector中最后一个元素的引用。

【注意】与成员vector::end不同,后者返回经过该元素的迭代器,此函数返回直接引用。

在空容器上调用此函数会导致未定义行为。

  std::vector myvector;

  myvector.push_back(10);  //myvector={10}

  while (myvector.back() != 0)
  {
    myvector.push_back ( myvector.back() -1 );
  }

//myvector={10,9,8,7,6,5,4,3,2,1,0}

 

4.迭代器

【C++】STL之vector容器(定义及基本函数应用)_第4张图片

① begin

 作用:返回一个指向vector中第一个元素的迭代器。

【注意】与返回对第一个元素的引用的成员vector::front不同,这个函数返回一个指向它的随机访问迭代器。 

如果容器为空,则返回的迭代器值不能被解引用

② end

 作用:返回指向vector容器中past-the-end 元素的迭代器。

past-the-end 元素是理论元素,在vector的最后一个元素之后。它不指向任何元素,因此不能被解引用

由于标准库函数使用的范围不包括其关闭迭代器所指向的元素,因此该函数通常与vector::begin结合使用,以指定包含容器中所有元素的范围。

如果容器为空,则返回与vector::begin相同的值。

  std::vector myvector;
  for (int i=1; i<=5; i++) 
  {
      myvector.push_back(i);
  }

  for (std::vector::iterator it = myvector.begin() ; it != myvector.end(); ++it)
  {
      cout<<*it<<",";
  }

   //myvector={1,2,3,4,5}

 

③ rbegin 

 作用:返回指向vector中最后一个元素的反向迭代器(即vector的反向起始)。

反向迭代器向后迭代:迭代器增加,会向容器的头移动。

【注意】与vector::back不同,该函数返回一个反向随机访问迭代器。

④ rend 

 作用:返回一个反向迭代器,指向vector中第一个元素之前的理论元素(该元素被认为是vector的反向末端)。

vector::rbegin和vector::rend之间的范围包含vector的所有元素(以相反的顺序)。

  std::vector myvector (5);  // 5 default-constructed ints

  int i=0;

  std::vector::reverse_iterator rit = myvector.rbegin();
  for (; rit!= myvector.rend(); ++rit)
    *rit = ++i;

  // myvector={5,4,3,2,1}

5.容量

【C++】STL之vector容器(定义及基本函数应用)_第5张图片

① size

 作用:返回vector中元素的个数。

【注意】vector中保存的实际对象的数量,不一定等于它的存储容量。

  std::vector myints;
  std::cout  << myints.size() << std::endl;  //0

  for (int i=0; i<10; i++) myints.push_back(i);
  std::cout << myints.size() << std::endl;  //10

  myints.insert (myints.end(),10,100);
  std::cout  << myints.size() << std::endl; //20

  myints.pop_back();
  std::cout <<  myints.size() << std::endl; //19
② max_size 

 作用:返回vector所能容纳的最大元素数。

【注意】由于已知的系统或库实现限制,这是容器可以达到的最大潜在大小,但是容器不能保证能够达到这个大小:在达到这个大小之前,它仍然可能无法分配存储。

③ capacity

 作用:返回当前为vector分配的存储空间大小(容量),以元素个数表示。

【注意】这个容量不一定等于向量的大小。它可以相等或更大,额外的空间允许容纳增长,而不需要在每次插入时重新分配。这个容量并没有假设向量的大小有限制。当此容量耗尽并且需要更多容量时,容器会自动对其进行扩展(重新分配其存储空间)。vector的大小的理论极限由成员max_size给出。可以通过调用vector::reserve成员显式地改变vector的容量。

  std::vector myvector;

  // set some content in the vector:
  for (int i=0; i<100; i++) myvector.push_back(i);

  std::cout << "size: " << myvector.size() << "\n";            //100
  std::cout << "capacity: " << myvector.capacity() << "\n";    //128
  std::cout << "max_size: " << myvector.max_size() << "\n";    //1073741823
④ reserve 

 作用:使vector容器容量至少足以容纳n个元素。

【注意】如果n大于当前的vector容量,则该函数使容器重新分配其存储空间,将其容量增加到n(或更大)。在所有其他情况下,函数调用不会导致重新分配,向量容量也不会受到影响。

这个函数对vector的大小没有影响,也不能改变vector的元素

⑤ resize

 作用:调整容器的大小,使其包含n个元素。

【注意】

1)如果n小于当前容器的大小,则元素将被减少到前n个元素,并删除超出的元素(并销毁它们)。

2)如果n大于当前容器的大小,则通过在末尾插入所需的元素来扩展内容,以达到n的大小。如果指定了val,则将新元素初始化为val的副本,否则将其进行值初始化。

3)这个函数通过插入或删除元素来改变容器的实际内容。

  std::vector myvector;

  // set some initial content:
  for (int i=1;i<10;i++) myvector.push_back(i);

  //myvector={1,2,3,4,5,6,7,8,9}


  myvector.resize(5);           //myvector={1,2,3,4,5}
  myvector.resize(8,100);       //myvector={1,2,3,4,5,100,100,100}
  myvector.resize(12);          //myvector={1,2,3,4,5,100,100,100,0,0,0,0}

⑥ empty

 作用:返回vector是否为空(即它的大小是否为0)。

该函数不以任何方式修改容器。要清除vector的内容,请参见vector::clear。


四、实例演示

1.一维数组的定义及访问(直接数组访问&迭代器访问)

#include 
#include 
#include 
using namespace std;

int main() {
    vectorobj1;//创建一个向量存储容器 int
    vectorobj2(20,1);//创建一个int型向量容器,最大容量20,初始值为0
    for (int i = 0; i < 10; i++) // push_back(elem)在数组最后添加数据 
    {
        obj1.push_back(i+1);
    }

    //直接数组访问
    cout << "数组1:";
    for (int i = 0; i < obj1.size(); i++)//size()容器中实际数据个数 
    {
        cout << obj1[i] << " ";
    }
    cout << endl;

    //迭代器访问
    cout << "数组1:";
    vector ::iterator it;//声明一个迭代器
    for (it = obj1.begin(); it != obj1.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    vector obj3(obj1);
    for (int i = 0; i < 5; i++)//去掉数组最后一个数据 
    {
        obj3.pop_back();
    }

    cout << "数组3:";
    for (int i = 0; i < obj3.size(); i++)//size()容器中实际数据个数 
    {
        cout << obj3[i] << " ";
    }
    cout << endl;
 
    int a[] = { 1,2,3,4 };
    vector obj4(a,a+4);
    cout << "数组4:";
    for (int i = 0; i < obj4.size(); i++)//size()容器中实际数据个数 
    {
        cout << obj4[i] << " ";
    }
    cout << endl;
    return 0;
}

运行结果:

【C++】STL之vector容器(定义及基本函数应用)_第6张图片

2.pop_back()&push_back(elem)实例在容器最后移除和插入数据

#include 
#include 
#include 
using namespace std;

int main() {
    vectorobj1;//创建一个向量存储容器 int
    for (int i = 0; i < 10; i++) // push_back(elem)在数组最后添加数据 
    {
        obj1.push_back(i + 1);
    }

    cout << "原始数组1:";
    for (int i = 0; i < obj1.size(); i++)//size()容器中实际数据个数 
    {
        cout << obj1[i] << " ";
    }
    cout << endl;

    
    for (int i = 0; i < 5; i++)//去掉数组最后一个数据 
    {
        obj1.pop_back();
    }

    cout << "删除后数组1:";
    vector ::iterator it;//声明一个迭代器
    for (it = obj1.begin(); it != obj1.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

  
    return 0;
}

运行结果:

3.insert()&erase(elem)实例在容器任意位置插入和移除数据

#include 
#include 
#include 
using namespace std;

int main() {
    vectorobj1;//创建一个向量存储容器 int
    for (int i = 0; i < 10; i++) // push_back(elem)在数组最后添加数据 
    {
        obj1.push_back(i + 1);
    }

    cout << "原始数组:";
    for (int i = 0; i < obj1.size(); i++)//size()容器中实际数据个数 
    {
        cout << obj1[i] << " ";
    }
    cout << endl;


    obj1.erase(obj1.begin()+1);//删除数组第二个数据 

    cout << "删除数组第二个数据后:";
    vector ::iterator it;//声明一个迭代器
    for (it = obj1.begin(); it != obj1.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    obj1.erase(obj1.begin() + 2, obj1.begin() + 5);//删除数组中第三到第五个数据(左闭右开)
    cout << "删除数组中第三到第五个数据后:";
    for (it = obj1.begin(); it != obj1.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    obj1.insert(obj1.end() - 2,0);//倒数第三个位置插入0
    cout << "倒数第三个位置插入0后:";
    for (it = obj1.begin(); it != obj1.end(); it++) {
        cout << *it << " ";
    }
    return 0;
}

运行结果:

4.clear()清除容器中所有数据

#include 
#include 
using namespace std;
 
int main()
{
    vectorobj;
    for(int i=0;i<10;i++)//push_back(elem)在数组最后添加数据 
    {
        obj.push_back(i);
        cout<

运行结果:

5.排序函数sort()和逆序函数reverse()

#include 
#include 
#include 
using namespace std;

int main() {
    vectorobj1;//创建一个向量存储容器 int
    obj1.push_back(-2);
    obj1.push_back(1);
    obj1.push_back(13);
    obj1.push_back(23);
    obj1.push_back(0);
    obj1.push_back(96);
    obj1.push_back(11);

    cout << "原始数组:";
    for (int i = 0; i < obj1.size(); i++)//size()容器中实际数据个数 
    {
        cout << obj1[i] << " ";
    }
    cout << endl;

    sort(obj1.begin(), obj1.end());//默认为升序排序
    cout << "升序排序数组:";
    vector ::iterator it;//声明一个迭代器
    for (it = obj1.begin(); it != obj1.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

   //逆序方法1
    reverse(obj1.begin(), obj1.end());
    cout << "逆序数组1:";
    for (int i = 0; i < obj1.size(); i++)//size()容器中实际数据个数 
    {
        cout << obj1[i] << " ";
    }
    cout << endl;

    int obj2[] = { 1,2,3,4,5 };
    int len = sizeof(obj2) / sizeof(obj2[0]);

    cout << "原始数组2:";
    for (int i = 0; i ());
    cout << "逆序数组2:";
    for (int i = 0; i < len; i++)//size()容器中实际数据个数 
    {
        cout << obj2[i] << " ";
    }
    cout << endl;
    return 0;
}

运行结果:

【C++】STL之vector容器(定义及基本函数应用)_第7张图片

6.二维数组的定义

/*方法一*/
#include 
#include 
#include 
using namespace std;

int main()
{
    int N = 5, M = 6;
    vector > obj(N); //定义二维动态数组大小5行 
    for (int i = 0; i < obj.size(); i++)//动态二维数组为5行6列,值全为0 
    {
        obj[i].resize(M);
    }

    for (int i = 0; i < obj.size(); i++)//输出二维动态数组 
    {
        for (int j = 0; j < obj[i].size(); j++)
        {
            obj[i][j] = M*i + j+1;
            cout << setw(3)<< obj[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

运行结果:

【C++】STL之vector容器(定义及基本函数应用)_第8张图片

/*方法二*/
#include 
#include 
#include 
using namespace std;


int main()
{
    int N = 5, M = 6;
    vector > obj(N,vector(M)); //定义动态二维数组为5行6列,值全为0 
  

    for (int i = 0; i < obj.size(); i++)//输出二维动态数组 
    {
        for (int j = 0; j < obj[i].size(); j++)
        {
            obj[i][j] = M * i + j + 1;
            cout << setw(3) << obj[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

运行结果:

【C++】STL之vector容器(定义及基本函数应用)_第9张图片

你可能感兴趣的:(C++,c++,开发语言)