C++ vector 动态数组使用

首先我们要明白以下几点:

1.vector数组是一个能存放任意数据类型(类,结构,普通变量类型等)的动态数组!,在数据结构中就相当于顺序储存的线性表,寻找元素非常快,但是插入元素的时间却很大(list是一个双向链表,在同一个为止插入大量的数据时速度很快,但是查找的速度就会慢很多)

2.和普通数组一样可以通过下标索引来进行访问

3.与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起lists和forward_lists统一的迭代器和引用更好。

4.vector动态数组可以通过数组名进行直接赋值!  vector<yang> c;   vector<yang> b;    b = c; 

5.他的缺点:当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。(比普通的数组具有更高的时间复杂度和空间复杂度

vector的常规操作:

vector的定义:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#include<vector>//头文件一定要有

 

using namespace std;//其所在的命名空间

 

vector<int> vec;        //声明一个int型向量

 

vector<int> vec1(4,1);                            //vec1的内容为1,1,1,1

vector<int> vec1{ 1, 2, 3, 4, 5, 6 };             //vec1内容1,2,3,4,5,6

 

vector<int> vec(tmp);   //声明并用tmp向量初始化vec向量(也可以用vec=t,p)

 

int arr[5] = {1, 2, 3, 4, 5};  

vector<int> vec(arr, arr + 5);      //将arr数组的元素用于初始化vec向量

//说明:当然不包括arr[4]元素,末尾指针都是指结束元素的下一个元素,

//这个主要是为了和vec.end()指针统一。

vector<int> vec(&arr[1], &arr[4]); //将arr[1]~arr[4]范围内的元素作为vec的初始值

  

 数组插入元素:

1.vec.push_back(同类型量);作用是在vector的末尾插入新元素;

2.insert()第一个参数为迭代器,作用为在迭代器前面插入新元素;

3.assign(5,1)向vector中加入5个1,同时清除掉以前的元素。

1

2

3

4

5

6

7

8

9

10

11

12

std::vector<int> vec1; 

  vec1.push_back(1); 

  vec1.push_back(2); 

//vec1元素:1,2

  std::vector<int> vec2(vec1);  //将vec1赋值给vec2

  std::vector<int>::iterator it; 

  it=vec2.begain(); 

  vec2.insert(it,5);  //在第一个元素前添加5

  it=vec2.begain();  //每当新插入一个元素时内存重新分配所以要重新为迭代器分配指针

  vec2.insert(it,2,6);

  std::vector<int> vec3(vec2); 

  vec3.assign(2,5);  //清楚所有元素只留两个5

删除元素: 

1.pop_back()删除最后一个元素。

2.erase()删除指定位置元素。(其中的参数要是指针变量,比如begain(),end(),以及迭代器值),例如vec.erase(vec.begin()+2);删除第3个元素

3.clear()清除所有元素。

4.empty()判断该数组是否为空

遍历数组:

1.front()访问第一个元素(第一个元素的值而不是地址!begin()相反)

2.back()访问最后一个元素(最后一个元素的值而不是地址!end()相反)

3.size()数组的元素个数

1

2

3

4

5

6

7

8

9

10

11

12

13

vector<int> a;

//像数组一样以下标访问

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

{

    cout << a[i];

}

  

//以迭代器访问

vector<int>::iterator it;

for(it=a.begin(); it!=a.end(); it++)

{

    cout<<*it<<" " ;

}

 

翻转和排序的遍历:

1

2

3

4

5

6

7

8

9

10

#include <algorithm>

reverse(vec.begin(), vec.end())//将元素翻转,即逆序排列!

 

#include <algorithm>

sort(vec.begin(), vec.end()); //采用的是从小到大的排序

//如果想从大到小排序,可以采用上面反转函数,也可以采用下面方法:

bool Comp(const int& a, const int& b) {

    return a > b;

}

sort(vec.begin(), vec.end(), Comp);

用vector数组创建二维数组:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//C++ 构建二维动态数组

int **p;

p = new int*[10];    //注意,int*[10]表示一个有10个元素的指针数组

for (int i = 0; i < 10; ++i)

{

    p[i] = new int[5];

}

 

//用vector构建二维数组

vector<vector<int>> matrix;

vector<int>a;

a.push_back(1);

a.push_back(3);

a.push_back(1);

matrix.push_back(a);

//或者用下面的方法

int i,j;

vector<vector<int>> array(5);

for (i = 0; i < array.size(); i++)

    array[i].resize(3);//这里一定要使用resize其相当于每行的元素数并已经初始化过了

 

 

使用注意事项:

迭代器中删除元素的操作时:

删除元素:

1

2

3

4

5

6

7

8

9

10

11

std::vector< int> Vec;

std::vector< int>::iterator itVec;

for( itVec = Vec.begin(); itVec != Vec.end(); )

{

      if( WillDelete( *itVec) )

      {

          itVec = Vec.erase( itVec);

       }

      else

          itList++;

}

  

     对vector、queue等,每次erase操作,函数会删除指定迭代器位置的元素,然后将后面的元素前移一位,erase返回指向被删除元素下一元素的迭代器。(其实,我认为,返回的还是指定的迭代器,只不过它现在指向了被删除元素的下一元素,如有不对,恳请大家指正!)

     对于erase操作,还有一种写法是:Vec.erase(itVec++)

    不过需要注意,这种写法对vector、deque等容器无效!

上面两种写法,第一种对各种容器都有效,第二种写法只对map,list等容器有效。为了方便统一,还是建议采取第一种写法。

增加元素:

出于学习的目的,现在提出一个要求,如原有vector为{1,2,3,4,5},现在要在每个元素前加一个8,使vector变为{8,1,8,2,8,3,8,4,8,5}.用循环表示,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#include<iostream>

#include <vector>

using namespace std;

 

int main()

{

    vector<int> vec{ 1,2,3,4,5};

    auto iter = vec.begin();

    for (; iter != vec.end();)

    {

        iter = vec.insert(iter,8);

        iter++;

        iter++;

    }

    for (auto num : vec)

        cout << num << endl;

    return 0;

}

需要注意的是,insert会将指定对象插入指定迭代器之前的位置,并返回这个位置的迭代器,要想该迭代器指向之前的下一个元素,需要递增两次。

如果需要在每个元素之后插入元素,该怎么操作?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include<iostream>

#include <vector>

using namespace std;

 

int main()

{

    vector<int> vec{ 1,2,3,4,5};

    auto iter = vec.begin();

    iter++;

    for (; iter != vec.end();)

    {

        iter = vec.insert(iter,8);

        iter++;

        iter++;

    }

    vec.insert(vec.end(),8);

    for (auto num : vec)

        cout << num << endl;

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值