STL之vector

不知道大家之前学过模板没?就是template<typename T>使用这种方法写的函数或者类就不会受到类型的限制,比如

template<typename T>

T VIP_max(T a,T b)

{

return a>b?a:b;

}

template<typename T>

class Max

{

public:

Max(T a,T b)

{

m_a = a;

m_b = b;

}

T GetMax()

{

return m_a>m_b?m_a:m_b;

}

private:

T m_a;

T m_b;

};

这样一个简单的模板类用来比较大小可以使用任意类型来调用

这样

Max<char> MyMax('a','z');

char nResult = MyMax.GetMax();

这样

Max<int> MyMax(3,4);

int nResult = MyMax.GetMax();

亦或者是这样:

Max<double> MyMax(3.14,5.26);

double nResult = MyMax.GetMax();

都是可以的所谓STL就是标准模板库的意思是优秀的程序员写出来的一些优良算法组成的模板 这样就能够节省许多开发成本

那么玩完这个之后正式开始学习vector:

vector<int> Myint;
Myint.push_back(1);//push_back这个函数就是用来添加元素的
Myint.push_back(2);
Myint.push_back(3);
Myint.push_back(3);
Myint.pop_back();//就是删除最后一个元素
for (size_t i=0;i<Myint.size();i++)//size()函数可以得出整个容器的大小,为了输出使用以前的C++基础很容易联想到用这种方法达到目的
{
cout<<Myint[i]<<" "<<endl;
}

但是除此之外还可以用迭代器 这是vector很具特色的一样东西

vector <int>::(reverse_)iterator it = Myint.(r)begin(); //可逆序可正序

for (it ;it != Myint.(r)end();it++)
{
  cout<<*it<<endl;
}
cout<<endl;

vector 的取值可以使用[]也可以使用vector.at();

其中我觉得.at()函数调用更加好因为这里有异常捕捉

try
{
Myint.at(90);
}
catch (const exception & error)
{
cerr << error.what() << endl;

}

//这样的话程序就不容易崩溃

vector.front();//可以返回第一个数据

vector.back();//可以返回最后一个数据

//有关于赋值:
int array[] = {0,1,2,3,4,5};
vector<int> vecInA(array,array + 6);
vector<int> vecInB(vecInA.begin(),vecInA.end());

 

 双向迭代器支持操作:

it++,++it,it--.--it.*it,itA = itB,itA==itB,itA!=itB

list set multiset map multimap支持双向迭代器

随即访问迭代器支持:(在双向迭代器的基础上加上)

it+=i, it-=i,it+i,it[i]

itA<itB itA<=itB itA>=itB

vector deque支持随机访问迭代器

 但是经过我自己写的代码检查 似乎迭代器越界不会捕捉异常


// ++it;
// int nTemp = *it;
// --it;
// nTemp = *it;
// try
// {
// it+=3;
// nTemp = *it;
// }
// catch (const exception & error)
// {
// cerr << error.what() << endl;
//
// }//无法捕捉到迭代器越界异常程序崩溃

vector大小:

.size()

.empty()

.resize()//很有趣 变大默认赋值0变小则直接丢弃 可以加参数则默认赋值参数

vector插入:

.insert(pos,elem)//pos位置插入elem元素的拷贝返回新数据的位置

.insert(pos,n,elem)//插入n个相同元素

.insert(pos,beg,end)//插入【beg,end】区间的数据无返回

vector删除:

.clear()//删除容器里所有的数据

.erase(pos)//删除pos位置的数据返回下个数据的位置

.erase(beg,end)//删除区间数据返回下个数据的位置

//迭代器删除某一指定值:

int arraya[] = {1,3,2,3,3,3,4,3,5,3};
vector<int> vecInt(arraya,arraya + 10);
for (vector<int>::iterator it = vecInt.begin();it != vecInt.end();)
{
if (3 == *it)
{
  it = vecInt.erase(it);
}
else
{
  ++it;
}

}

 

原文地址:https://www.cnblogs.com/XCoderLiu/p/3520099.html