STL之vector详解

来源:互联网 发布:java游戏内购破解版 编辑:程序博客网 时间:2024/05/24 00:52

vector用法:

总结了下大家写的,感觉用着很方便;

vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

为了可以使用vector,必须在你的头文件中包含下面的代码:

#include <vector>

 

vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:

using std::vector;

vector<int> vInts;

 

或者连在一起,使用全名:

std::vector<int> vInts;

 

建议使用全局的命名域方式:

using namespace std;

 

在后面的操作中全局的命名域方式会造成一些问题。vector容器提供了很多接口,在下面的表中列出vector的成员函数和操作。

 

Vector成员函数

函数

表述

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元素互换。

同上操作。

vector<Elem> c

vector <Elem> c1(c2)

vector <Elem> c(n)

vector <Elem> c(n, elem)

vector <Elem> c(beg,end)

c.~ vector <Elem>()

创建一个空的vector。

复制一个vector。

创建一个vector,含有n个数据,数据均已缺省构造产生。

创建一个含有n个elem拷贝的vector。

创建一个以[beg;end)区间的vector。

销毁所有数据,释放内存。

 以下用代码的方式实现:

1 基本操作
(1)头文件#include<vector>.
(2)创建vector对象,vector<int> vec;
(3)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(4)使用迭代器访问元素.
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;

常用函数:
(1)去重:
我们都知道unique的功能是去除相邻的重复元素(只保留一个),还有一个容易忽视的特性是它并不真正把重复的元素删除,
不知道这个特性用起来就会出问题。比如下面这个例子,企图输出无重复的元素, 
unique只是把重复的元素放到容器的后面,而它本身会返回一个迭代器,只向这些元素的开始部分。因此要向真正删除这些元素,
还是要“手工”处理一下。对于上面的例子,可以用vector窗口的erase
int vector_unique(vector<string> &vt)
{
    sort(vt.begin(), vt.end());
    vt.erase(unique(vt.begin(), vt.end()), vt.end());
}

(2)C++ Vector排序

vector< int > vi ;   
vi.push_back(1);  
vi.push_back(3);  
vi.push_back(0);  
sort(vi.begin() , vi.end()); /// /小到大  
reverse(vi.begin(),vi.end()) /// 从大道小 

(3)顺序访问
vector < int > vi ;   
for( int i = 0 ; i < 10 ; i ++)  
{  
vector.push_back(i);  
}   
for(int i = 0 ; i < 10 ; i ++) /// 第一种调用方法  
{  
cout <<vector[i] <<" " ;   
}  
for(vector<int>::iterator it = vi.begin() ; it !=vi.end() ; it++) ///第二种调用方法  
{  
cout << *it << " " ;  


(4)寻找
vector < int > vi ;   
for( int i = 0 ; i < 10 ; i ++)  
{  
vector.push_back(i);  
}   
vector < int >::interator it = find(vi.begin() , vi.end,3) ;  
cout << *it << endl ; ///返回容器内找到值的位置。

(5) 统计vector向量中指定元素出现的次数:count()算法

   int num= count (vector.begin(),vector.end(),100);//统计100出现的次数

(6) count_if():利用函数对象统计满足条件对象的个数

函数对象是一个至少带有一个operator()方法的类。

函数对象被约定为STL算法调用operator时返回true或false,它们根据这个来判定这个函数。

count_if()函数通过传递一个函数对象来做出比count()统计函数更加复杂的评估以确定一个对象是否应该被计数,
即count_if()函数的功能等同于count()函数和一些条件语句。
int num= count_if (vector.begin(),vector.end(),operator());

复制代码
 1 #include<stdio.h> 2 #include<vector> 3 #include<algorithm> 4 int main(){ 5     std::vector<int>vec; 6     std::vector<int>::iterator iter; 7     for(int i=11;i<20;i++)vec.push_back(i); 8     for(int i=11;i<20;i++)vec.push_back(i); 9     for(int i=0;i<20;i++)printf("%d ",vec[i]);//当超过容器的size时答案为0; 10     puts("");printf("当前容器大小为:%d\n",vec.size());11     printf("删除第三个元素:%d\n",vec[2]);vec.erase(vec.begin()+2); 12     for(iter=vec.begin();iter!=vec.end();iter++)printf("%d ",*iter);13     puts("");14     reverse(vec.begin(),vec.end());//反转当前容器中的元素;15     for(int i=0;i<vec.size();i++)printf("%d ",vec[i]); puts("");16     sort(vec.begin(),vec.end());//排序;17     iter=vec.begin();18     while(iter++!=vec.end())printf("%d ",*iter); 19     return 0;20 }
复制代码


0 0
原创粉丝点击