暑假培训以来,大量的用到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));
}
跑图的时候一般就这么存图,高级的什么链式前向星了,学不会,不会用,就不写了(呜呜呜~~~);