关闭

STL之vector用法总结

标签: vectorlistiterator数据结构算法insert
222人阅读 评论(0) 收藏 举报
分类:

STL之vector用法总结

vector是一种顺序容器,有大小限制,但是可以动态的扩展,不能减小对应的空间,同数组一样,是线性排列的,在其尾不插入删除效率很高,中间的插入删除效率一般,可以向数组一样随机访问表中的元素。STL中的数据结构,都可以使用自定义的数据类型,便于扩展。

头文件:#include<vector>

using namespace std ;

1.创建对象与初始化:

(a) vector<T> v ;//创建一个T类型的vector,此时vector为空,容量为0.

(b) vector<T> v (n);//创建一个T类型的vector,容量为n

(c) vector<T> v(v1) ;//创建一个T类型的vector,为v1的一个拷贝,要求数据类型相同。

(d) vector<T> v(n1 , n2) ;//创建一个T类型的vector,含n1个元素,每个元素的值都为n2 

(e) vector<T>v(v1.begin() , v2.end()) ;//创建一个T类型的vector对象v,元素为区间[v1.begin() , v1.end())的元素。

2.assign()//分配值

list相同有两中使用方式:

v.assign(v1.begin() , v1.end()) ;//如果v1中的元素为74,此时v中有74,后面的元素默认初始化为0

v.assign(7 , 4) ;//v中的元素为74,如果原来v的大小没有7,那么会申请空间到7个。

3.back();//返回最后一元素,与list相同

4.begin();//返回第一个元素的迭代器,这些与list都相同

5.capacity()//返回vector所能容纳的元素数量(在不重新分配内存的情况下)

6.clear();//清空所有元素。

7.empty();//判断vector是否为空(返回true时为空)

8.end();//返回最末元素的迭代器(译注:实指向最末元素的下一个位置)

9.erase();//删除节点内容用到了erase()函数,有两个重载:

iterator erase( iterator loc );

iterator erase( iterator start, iterator end );

这两个迭代操作尤其需要注意,涉及到迭代器的操作都需要考虑迭代器的时效性,操作完后,迭代器就失效了,需要重新复制,才能合法访问。

10.front() ;//返回第一个元素

11.get_allocator();//返回vector的内存分配器,感觉不怎么常用

12.insert() ;//插入元素到vector中,运用类似与listinsert,含有三种形式,在指定位置,插入一个或者多个元素;

如:

v1.insert(v1.begin() + 10 , 5);//在第11个位置插入一个元素值为5

v1.insert(v1.begin() , v.begin() , v.end());//v1的开始将v的元素依次插入到v1中。

v2.insert(v2.begin() , 5 , 100) ;//v2的开头插入5100

13.max_size();//返回vector所能容纳元素的最大数量(上限)

14.pop_back();//移除最后一个元素

15.push_back();//vector最后添加一个元素

16.rbegin();//返回vector尾部的逆迭代器

17.rend();//返回vector起始的逆迭代器

18.reserve();//设置vector最小的元素容纳数量

19.resize();//改变vector元素数量的大小,重新设定大小

20.size();//返回vector元素数量的大小

21.swap() ;//交换两个vector,此处传递的是地址,不是值传递,按引用方式传递,会发生实际交换。

22.关于vector的访问方式

前面说过vector的访问方式就像数组一样,vector有三种访问方式:

1. v.at(n) ;//访问地n个元素,此时要确保不能越界。

2. v[n] ;像数组一样直接访问第n个元素,同样保证不能越界

3. 使用迭代器顺序访问:

vector<int> ::iterator it ;

for(it=v2.begin() ; it!=v2.end() ; it ++)

{

cout<<(*it) + 5<<endl ;

}

在使用迭代器的时候注意迭代器的使用范围,特别是对于增删操作的时候,尤其当心迭代器的范围,很容易导致迭代器失效。并且迭代器的效率一般不是很高,如果可以使用下表形式,最好使用下标形式来遍历以及操作对象中的元素。

vector的一个简单使用例子:

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<vector>

using namespace std ;

int main()
{
	vector<int> v(10) ;
	cout<<v.size()<<endl ;
	vector<int> v1(10 , 2) ;

	int  i ;
	i =0 ;
/*	while(i < 10)
	{
		cout<<v1[i]<<endl ;
		i++ ;
	}
	*/
	vector<int> v2(20) ;
	cout<<v2.size()<<endl ;
	v2.assign(v1.begin() , v1.end()) ;
	i = 0 ;
	while(i<20)
	{
		cout<<v2[i]<<endl ;
		i++ ;
	}
	cout<<v2.capacity()<<endl ;
	v2.assign(30,4) ;
		i = 0 ;
	v2.insert(v2.begin() , 5 , 100) ;
	while(i<30)
	{
		cout<<v2[i]<<endl ;
		i++ ;
	}
	cout<<v2.size()<<endl ;
	cout<<endl ;

	vector<int> ::iterator it ;
	for(it=v2.begin() ; it!=v2.end() ; it ++)
	{
		cout<<(*it) + 5<<endl ;
	}
	cout<<"swap"<<endl;
	v2.swap(v1) ;
	for(it=v2.begin() ; it!=v2.end() ; it ++)
	{
		cout<<(*it) + 5<<endl ;
	}
	return 0 ;
}









关于vectorSTL中的算法的组合使用,会在后面的STL算法中继续介绍。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:93300次
    • 积分:2458
    • 等级:
    • 排名:第15575名
    • 原创:167篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条