c++中vector基本用法–初始化、添加、遍历、插入、删除、查找、排序、释放操作

  • Post author:
  • Post category:其他


暑假培训以来,大量的用到vector,觉得c++里面的STL用着还是不错的;就是有时会用错,比如vector,想用,但是没学过,每次用查一查博客等到下次用的时候又会出错;那么今天就查阅资料总结一下吧;

客观说一下vector:C++的vector本质上是一个动态数组,数据量不大的情况下,非常方便存储和访问操作,当然,不好的情况是数据量大的情况下,查找效率低,删除操作还会导致大量的数组移动操作。(当然这是学长说的)感觉很有道理 ,嗯就是滴!



简单的vector操作:
         vector<int> c.
         c.clear()         移除容器中所有数据。
         c.empty()         判断容器是否为空。
         c.erase(pos)        删除pos位置的数据
         c.erase(beg,end) 删除[beg,end)区间的数据
         c.front()         传回第一个数据。
         c.insert(pos,elem)  在pos位置插入一个elem拷贝
         c.pop_back()     删除最后一个数据。
         c.push_back(elem) 在尾部加入一个数据。
         c.resize(num)     重新设置该容器的大小
         c.size()         回容器中实际数据的个数。
         c.begin()           返回指向容器第一个元素的迭代器
         c.end()             返回指向容器最后一个元素的迭代器



然后说一说容易出错的地方:


1

c.clear()         移除容器中所有数据。

这个在题目中循环输入的时候特别要注意,每次数据更新都要把vector清空;(如果每次都开一个vector,当我没说(手动滑稽~~~))


2

c.erase(pos)        删除pos位置的数据

这里的pos,是一个地址,不能是数组的下标,一般用迭代器实现;比如:

for(auto it=ve.begin()+1;it!=ve.end();)
{
	if(*it==0)
		it=ve.erase(it);
	else
		it++;
}


3.


vector其实使用起来和数组一样,但初始化又容易出错;比如这样我定义一个vector:

vector<int> v;

然后我直接像普通数组那样给他赋值,那肯定不正确;

v[0]=1;

不能这样写,因为此时vector是空的,你只能把元素放进去才能访问它,例如;


a[5]={1,2,3,4,5};
for(int i=0;i<5;i++)
{
	v.push_back(a[i]);
}

这里用到

c.push_back(elem) 在尾部加入一个数据elem。


4.

         c.begin()           返回指向容器第一个元素的迭代器
         c.end()             返回指向容器最后一个元素的迭代器

注意这里返回的都是迭代器;例如

#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
vector<int> ::iterator it;//定义一个迭代器
int main()
{
    /*iteretor感觉就像一个指针
    指针类型根据每一个容器有所不同
    iter接受所有指针操作的方法
    采用begin,end的赋值方法,可以避免容器为空产生的问题*/
    int ans=1;
    for(int i=1;i<=5;i++) v.push_back(ans++);//依次从1到5放进去五个数
    for(it=v.begin();it!=v.end();it++)//使用迭代器来循环输出;
    {
        int x=(*it);
        cout <<x<<" ";
    }
    return 0;
}

关于简单操作功能上容易出错的以后碰到再更新;



关于vector用来存图操作

首先要知道vector的这种用法:

vector<int> v[maxx];


其实这种操作的原理显而易见,就是开maxx多个vector数组来用;不要把它和vector二维构建出来的数组搞混了;这种用法主要就是来存图的;

(以下都以无向图为例)


无权图

	int x,y;
    vector<int,int> v[10010];
    for(int i=0;i<10;i++)
    {
        cin >>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }


带权图

    int x,y,z;
    vector<pair<int,int> > v[10010];
    for(int i=0;i<10;i++)
    {
        cin >>x>>y;
        v[x].push_back(make_pair(y,z));
        v[y].push_back(make_pair(x,z));
    }

跑图的时候一般就这么存图,高级的什么链式前向星了,学不会,不会用,就不写了(呜呜呜~~~);



版权声明:本文为weixin_43872728原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。