STL学习(二)vector
一.介绍
是动态数组,是连续的空间,如果空间不够用,会申请一个更大的连续的空间,同时迭代器失效
头文件为#include< vector >;
二.构造函数
(为了方便省略< T >)
-  vector(); 
 无参数的构造
-  vector(count); 
 n个元素,和数组类似
-  vector( n,elem ); 
 用num个val来初始化容器
 5个1
 6个‘a’
-  vector( const vector &from ); 
 拷贝构造
 一定是同种类型元素的vector
 用另一个vector对象初始化当前的vector对象
-  vector( begin,end ); 
 构造函数将[a,b)区间元素拷贝给本身,注意该区间左开右闭
三.属性
(一)容量
Visual Studio定义对象的时候初始化几个,无参数就是零
 容量不够时增加现有容量的一半。比如现有10个,新的就是15个,现有13个;增加13/2==6个,就是19个
VC++6.0
 无参数就是0
 容量不够时增加现有容量的一倍。比如现有10个,新的就是20个;现有20个,新的就是40个
reserve(); //可以提前预留空间以提高效率,
vector<int> v(10);   //capacity为10,size也为10,里面放有元素,加数据要重新申请内存
vector<int>v;
v.reserve(10);     //capacity为10但size为0,里面可以加数据   
修改容量
 不能变小,只能变大
 设置多大就是多大
 string 是有区间的 15-31-47-63…
(二)大小
size()
	元素个数
resize()
	重新设置元素个数
	缩小时容量不变
	放大时容量改变
empty()
	对象是否有元素
	vector<int>vec(6);
	cout << vec.capacity() << endl;   //6
	cout << vec.size() << endl;   //6
	vec.reserve(11);
	cout << vec.capacity() << endl;  //11
用resize()改变超过capacity时capacity增加(capacity>=size)
	vector<int>vec(6);
	cout << vec.capacity() << endl;
	cout << vec.size() << endl;
	vec.reserve(11);
	vec.resize(12);
	cout << vec.capacity() << endl;
	cout << vec.size() << endl;
四.操作
(一)查
	for_each()
		输出全部
		循环
		迭代器
		
	at()
	[ ]
		下标运算
		
	back()
		返回尾巴的元素
		
	front()
		返回首元素
(二)增
- 尾增加
 push_back()
- 中间添加
 insert( pos ,elem);
 在pos位置插入elem元素
 insert( ipos,n,elem);
 在pos位置插入n个elem元素
 insert( pos, beg,end );
 在某个迭代器后加入另一个向量的中间一段
(三)删
-  尾删除 
 pop_back();
-  删除指定元素 
 erase( iterator loc );erase( iterator start, iterator end ); 
-  删除所有 
 clear();
(四)改
利用输出的形式可以修改
赋值函数(重新赋值,清除以前的)
assign(beg,end)
//将左开右闭区赋值给本身
assign(n,elem)
//将n个elem拷贝赋值
交换两个向量的内容
 void swap( vector &from );
五.算法
(一)遍历
for_each(First, Last,fun );
 参数三
 有无返回值都行
 参数是该容器的元素的类型
排序
void sort(First, Last );
 从小到大
void sort( First, Last, greater< T >());
 参数三 greater<>() 可以指定从大到小
乱序
函数random_shuffle()用来对一个元素序列进行重新排序(随机的)
#include<iostream>
#include<algorithm>
#include<vector>
#include<ctime>
#include<functional>
using namespace std;
void fun(int k)
{
	cout << k << " ";
}
int main()
{
	
	vector<int> vec;
	vec.push_back(1);
	vec.push_back(2);
	vec.push_back(3);
	vec.push_back(4);
	vec.push_back(5);
	
	
	for (int i = 0; i < 10; i++)
	{
		
		srand((unsigned int)time(nullptr));  //产生种子,获取系统时间
		random_shuffle(vec.begin(), vec.end());
		for_each(vec.begin(), vec.end(), fun);
		cout << endl;
	}
	system("pause");
	return 0;
}
结果:
 
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号