stl容器中我挺喜欢用vector的,因为他本身就是数组啊~提高编程效率。当然了,如果经常需要插入删除的话还是推荐用list
刚开始用stl的时候就查查这个简陋的东西,感觉非常够用,而且很清晰。
------------------------------------------------------------------
vector介绍
实际上就是个动态数组。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能。
为了可以使用vector,必须在你的头文件中包含下面的代码:#include<vector>
一、 定义和初始化
Vector<int> v; //默认构造函数v为空
Vector<T> v2(v); //v2是v的一个副本
Vector<T> v3(n,i); //v3包含n个值为i的元素
Vector<T> v4(n); //v4含有n个值为0的元素
二、Vector对象最重要的几种操作
1. v.size() 当前使用数据的大小
2. v.empty() 判断vector是否为空
3. v[n] 返回v中位置为n的元素
4. v1=v2 把v1的元素替换为v2元素的副本
5. v1= =v2 判断v1与v2是否相等
6. !=、<、<=、>、>= 保持这些操作符惯有含义
7. v.push_back(t) 在数组的最后添加一个值为t的数据
v.push_back(1); //把1和2压入vector 这样v[0]就是1,v[1]就是2
v.push_back(2);
8. v.pop_back(); // 弹出容器中最后一个元素(容器必须非空)
9. 我们可以用一个迭代器: vector<int>::iteratoriter=v.begin();//定义一个可以迭代int型vector的迭代器iter,它指向v的首位
while(;iter!=v.end();iter++)cout<<(*iter);//iter++指的是向前迭代一位,直到iter到超出末端迭代器为止,输出迭代器指向的值
三、c++ vector使用demo
#include <iostream>
#include <vector> //包含vector
using namespace std; //指定命名空间
int main()
{
cout<<"----------vectortest-----------"<<endl;
/
//定义一个vector
/
vector <int> vect;
vector <int> vect1(12);//12个int类型元素,每个元素的初始值均为0
vector <int> vect2(12,9);//12个int,初试值均为9
/
//使用数组初始化vector
/
int a[]={0,1,2,3,4,5,6,7,8,9,0};
//vector <数据类型> <容器名> (<开始地址>,<结束地址的下一个地址> )。执行过vt中元素为1,2,3
vector <int> vt(a+1,a+4);
//在尾部压入3个值
vt.push_back(1);
vt.push_back(2);
vt.push_back(3);
//定义迭代器iterator
vector <int>::iterator iter=vt.begin();//起始地址
vector <int>::iterator iter_end=vt.end();//结束地址,两个地址都是指针类型
//遍历vt
for(;iter!=iter_end;iter++)
{
cout<<*iter<<endl;
}
///
//弹出一个元素
///
vt.pop_back();//执行弹出
//以下两行重新获得起始和结尾地址
iter=vt.begin();
iter_end=vt.end();
cout<<"----------executedpop_back------"<<endl;
for(;iter!=iter_end;iter++)
{
cout<<*iter<<endl;
}
//插入元素
cout<<"----------insertinto------------"<<endl;
//插入格式:vector.insert(<起始地址>,<插入的数量>,<元素值>);如果插入的数量为1,则第二个参数可以被省略
vt.insert(vt.begin()+1,3,9);
iter=vt.begin();
iter_end=vt.end();
for(;iter!=iter_end;iter++)
{
cout<<*iter<<endl;
}
//删除元素
///
cout<<"----------erase-------------------"<<endl;
//删除格式1为:vector.erase(<删除元素的地址>);
//删除格式2为:vector.erase(<删除元素的起始地址>,<终止地址>);
iter=vt.begin();
iter_end=vt.end();
vt.erase(iter+1,iter_end);//删除第二个到最后一个的元素
iter_end=vt.end();
for(;iter!=iter_end;iter++)
{
cout<<*iter<<endl;
}
return 0;
}
函数
表述
c.assign(beg,end)
c.assign(n,elem)
将[beg; end)区间中的数据赋值给c。
将n个elem的拷贝赋值给c。
c.at(idx)
传回索引idx所指的数据,如果idx越界,抛出out_of_range。
c.back()
传回最后一个数据,不检查这个数据是否存在。
c.begin()
传回迭代器中的第一个数据地址。
c.capacity()
返回容器中数据个数。
c.clear()
移除容器中所有数据。
c.empty()
判断容器是否为空。
c.end()
指向迭代器中的最后一个数据地址。
c.erase(pos)
c.erase(beg,end)
删除pos位置的数据,传回下一个数据的位置。
删除[beg,end)区间的数据,传回下一个数据的位置。
c.front()
传回第一个数据。
get_allocator
使用构造函数返回一个拷贝。
c.insert(pos,elem)
c.insert(pos,n,elem)
c.insert(pos,beg,end)
在pos位置插入一个elem拷贝,传回新数据位置。
在pos位置插入n个elem数据。无返回值。
在pos位置插入在[beg,end)区间的数据。无返回值。
c.max_size()
返回容器中最大数据的数量。
c.pop_back()
删除最后一个数据。
c.push_back(elem)
在尾部加入一个数据。
c.rbegin()
传回一个逆向队列的第一个数据。
c.rend()
传回一个逆向队列的最后一个数据的下一个位置。
c.resize(num)
重新指定队列的长度。
c.reserve()
保留适当的容量。
c.size()
返回容器中实际数据的个数。
c1.swap(c2)
swap(c1,c2)
将c1和c2元素互换。同上操作。
可以使用reverse反向排列算法。需要定义头文件“#include <algorithm>”
reverse(v.begin(),v.end());
使用sort算法进行排序,默认情况下,对向量进行升序排列。
sort(v.begin(),v.end());
自己设计排序比较函数,按指定的规则进行排序
bool comp(constint &a,const int &b)
{
if (a!=b) return a>b;
else return a>b;
}
sort(v.begin(),v.end(),comp);
举例:
#include<algorithm>
#include<vector>
#include<iostream>
using namespacestd;
bool cmp( int a,int b )
{ return a > b;}
int main()
{
vector<int> v1;
v1.push_back(23);
v1.push_back(-1);
v1.push_back( 9999 );
v1.push_back( 0 );
v1.push_back( 4 );
cout << "Before sorting: ";
for(int i = 0; i < v1.size(); i++ )
cout << v1[i] <<" ";
cout << endl;
sort( v1.begin(), v1.end() );
cout << "After sorting: ";
for( i = 0; i < v1.size(); i++ )
cout << v1[i] <<" ";
cout << endl;
vector<int> v2;
for( i = 0; i < 10; i++ )
{
v2.push_back(i);
}
cout << "Before: ";
for( i = 0; i < 10; i++ )
{
cout << v2[i] <<" ";
}
cout << endl;
sort( v2.begin(), v2.end(), cmp );
cout << "After: ";
for( i = 0; i < 10; i++ )
{
cout << v2[i] <<" ";
}
cout << endl;
return 0;
}