STL_不定长数组-vector

vector是一个模板类。vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所要放入的元素(当程序所需要数组大小不确定的时候,使用它可以节省不少空间)。此外, vector 也提供了许多的方法来对自身进行操作

所需头文件:

#include< vector >
using namespace std;

1. 声明:

//声明一维数组的各种操作
vector< int> a  //声明一个int型变量a
vector< int> a(10)  //声明一个初始大小为10的int型变量a
vector< int> a(10,1)  //声明一个初始大小为10且值都为1的int型变量a

用vector声明一个二维数组其实只需要声明一个一维数组向量即可(一维数组的名字代表着它的首地址)即:

vector<int * > a

三维数组类似:

vector<int * * >a

2.输入输出等基本操作

输入:
(1)我们可以将 vector 初始化为一个已有数组的全部或一部分,只需指定希望被用来初始化 vector 的数组的开始地址以及数组最末元的下一位置来实现

arr={1,2,3,4,5};
把arr中元素复制到vector数组中:
vector<int>a(arr,arr+5)

(2)push_back方法

vector<int>a;
int b=1;
a.push_back(b);

输出:
(1.)循环输出

for(i=0; i<a.size(); i++)//循环输出数组值
           cout<<a[i]<<" " ;

(2)使用遍历器输出

vector<int>::iterator t ;
    for(t=a.begin(); t!=a.end(); t++)
        cout<<*t<<" " ;

完整代码:

//功能:输入一个数组值,然后在屏幕上输出
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
const int maxn=10000;
int main()
{
    int i,n,a[maxn];
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    vector<int>arr(a,a+n); 
    vector<int>::iterator t;

    for(t=arr.begin();t!=arr.end();t++)
        cout<<*t<<" ";

}

基本操作:
a.size() :读取大小
a.push_back(i): 向尾部添加i元素
a.pop_back() : 删除最后一个元素

3.vector中insert()的用法:

  • 指定位置loc前插入值为val的元素,返回指向这个元素的迭代器
  • 在指定位置loc前插入num个值为val的元素
  • 在指定位置loc前插入区间[start, end)的所有元素

示例代码:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> arr;
    arr.push_back(1);
    arr.push_back(2);
    arr.push_back(3);

//指定位置loc前插入值为val的元素,返回指向这个元素的迭代器
    arr.insert(arr.begin(),4);//在begin指向的数据前插入一个数据,结果为 4 1 2 3
    arr.insert(arr.begin()+2,5) ;//结果为  4 1 5 2 3
    arr.insert(arr.end(),6);//向末尾添加新的元素,结果为 4 1 5 2 3 6 
    //这里end()指向的元素是vector的最后一个元素的下一个元素,所以和begin()产生了区别
    vector<int> ::iterator it;

//在指定位置loc前插入num个值为val的元素    
    //vector<int> ::iterator bbegin=arr.begin();
    arr.insert(arr.begin(),4,7); //结果为 7 7 7 7 4 1 5 2 3 6 

    for(it=arr.begin();it!=arr.end();it++)
        cout<<*it<<" ";
}

4.erase()的用法
使用该方法进行删除元素操作
vector::erase()方法有两种重载形式
如下:

iterator erase( iterator _Where);
iterator erase( iterator _First, iterator _Last);

如果是删除指定位置的元素时:
返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

(1)基本操作
容器中各个元素各不相同

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> arr;
    for(int i=0;i<10;i++)
        arr.push_back(i);
    vector<int>::iterator t;
    for(t=arr.begin();t!=arr.end();t++)
        cout<<*t<<" ";
    cout<<endl;// 结果为 0 1 2 3 4 5 6 7 8 9 
    arr.erase(arr.begin());//删除begin指向元素,结果为1 2 3 4 5 6 7 8 9 
    for(t=arr.begin();t!=arr.end();t++)
        cout<<*t<<" ";
    cout<<endl;
    arr.erase(arr.begin());
    for(t=arr.begin();t!=arr.end();t++)
        cout<<*t<<" ";
    删除begin指向元素,结果为 2 3 4 5 6 7 8 9  
}

说明:要删除某个元素只需要把指向该元素的迭代器传给erase即可
(2)删除容器中相同的元素
错误做法:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> arr;
    arr.push_back(1);
    arr.push_back(2);
    arr.push_back(3);
    arr.push_back(1);
    arr.push_back(2);
    arr.push_back(3);

    vector<int>::iterator t;
    int n=2;//假如要删除元素为2

    for(t=arr.begin();t!=arr.end();t++)
    {
        if(*t==n)
        {
            arr.erase(t);
        }
    }        
    for(t=arr.begin();t!=arr.end();t++)
        cout<<*t<<" ";
}

说明:当erase删除一个元素后,t迭代器就失效了,变为了野指针。

解决方法:直接附删除元素的下一个迭代器给他

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> arr;
    arr.push_back(1);
    arr.push_back(2);
    arr.push_back(3);
    arr.push_back(1);
    arr.push_back(2);
    arr.push_back(3);

    vector<int>::iterator t;
    int n=2;//假如要删除元素为2

    for(t=arr.begin();t!=arr.end();t++)
    {
        if(*t==n)
        {
            t=arr.erase(t);
        }
    }        
    for(t=arr.begin();t!=arr.end();t++)
        cout<<*t<<" ";
}

vector中声明二维数组:

vector<int>arr[5];第一维大小为5,第二维大小符合vector特性

示例代码:

#include<iostream>
#include<vector>
using namespace std;  
int main()  
{  
    vector<int>arr[5];
    arr[0].push_back(1);
    arr[0].push_back(2);
    cout<<arr[0].size();


    return 0;  
}  

结果截图:

这里写图片描述

5.vector使用find()函数

An iterator to the first element in the range that compares equal to val.
If no elements match, the function returns last.

例子:

// find example
#include <iostream>     // std::cout
#include <algorithm>    // std::find
#include <vector>       // std::vector

int main () {
  // using std::find with array and pointer:
  int myints[] = { 10, 20, 30, 40 };
  int * p;

  p = std::find (myints, myints+4, 30);
  if (p != myints+4)
    std::cout << "Element found in myints: " << *p << '\n';
  else
    std::cout << "Element not found in myints\n";

  // using std::find with vector and iterator:
  std::vector<int> myvector (myints,myints+4);
  std::vector<int>::iterator it;

  it = find (myvector.begin(), myvector.end(), 30);
  if (it != myvector.end())
    std::cout << "Element found in myvector: " << *it << '\n';
  else
    std::cout << "Element not found in myvector\n";

  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值