STL基础1:vector

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std; 


bool findCondition(int x)
{
	return x%2==0;
}

//仿函数
template<typename T>
struct display{
	void operator()(const T &x)const
	{
		cout<<x<<" ";
	}
};

int main()
{

	int i;

	vector<int> iv;//vector 追加和随机访问效率高,插入删除效率低

	int ia[]={0,1,2,3,4,5,6,6,6,7,8};  
    vector<int> iv2(ia,ia+sizeof(ia)/sizeof(int)); //数组转换成向量
	for_each(iv2.begin(),iv2.end(),display<int>());
	cout<<endl;

	iv.push_back(1);
	iv.push_back(2);
	iv.push_back(3);
	iv.push_back(4);
	iv.push_back(5);
	iv.pop_back(); //推出 5 ,返回void

	for_each(iv.begin(),iv.end(),display<int>());
	cout<<endl;

	cout<<"元素的数量"<<iv.size()<<"容量"<<iv.capacity()<<endl;

	//随机读写
	iv[0] = 99;
	cout<<iv[0]<<endl;
	
	vector<int>::iterator it,it2;
	it=iv.begin();//iv.begin()指向第一个元素
	iv.insert(it,3,-1);//在it所指的单元前插入3个-1
	
	it=iv.end()-1;//iv.end()指向了下一个最后一个元素的下一个元素
	iv.erase(it);//删掉倒数第1个元素,也可以删除区间的元素
	cout<<"迭代器输出 "<<*it<<endl;//输出的是刚才那个被删掉的元素4,也就是说删掉元素之后,it并没有改变,而且指向了一个被删除的元素
	
	iv2.assign(iv.begin(),iv.end());//复制iv到iv2
	if(iv==iv2)
	{
		cout<<"iv == iv2"<<endl;
	}
	iv2.clear();//删除容器中的所有元素,iv.size()变成0,而iv.capacity()不变,也就是内存并未归还给OS
	iv2.swap(vector<int>());//iv.capacity()也变为0,删除并归还内存给OS的常用方法

	//非变异算法
	it = find(iv.begin(),iv.end(),3);//在[first,last)(闭开区间)上查找等于3值的元素
	if(it==iv.end()){
		cout<<"Not found 3"<<endl;
	}else{
		cout<<"Found in iv["<<it-iv.begin()<<"]"<<endl;
	}
	
	it = find_if(iv.begin(),iv.end(),findCondition);//查找被2整除的元素
	if(it==iv.end()){
		cout<<"Not found %2"<<endl;
	}else{
		cout<<"Found in iv["<<it-iv.begin()<<"]"<<endl;
	}

	cout<<"count -1 is "<<count(iv.begin(),iv.end(),-1)<<endl;


	//求和,第三个值0是用于函数辨识数据类型
	cout<<"sum = "<<accumulate(iv.begin(),iv.end(),0)<<endl;
	//string sum = accumulate(v.begin() , v.end() , string(" "));这个可以把向量字符串连接起来
	
	//变异算法
	cout<<"翻转 前";
	for_each(iv.begin(),iv.end(),display<int>());
	cout<<endl;
	reverse(iv.begin(),iv.end());
	cout<<"翻转 后";
	for_each(iv.begin(),iv.end(),display<int>());
	cout<<endl;

	replace(iv.begin(),iv.end(),-1,200);//将所有的-1替换成200
	fill_n(iv.begin(),3,44);//在开头填充3个44,如果空间不足就会报错
	fill_n(iv.begin()+4,2,2);
	//generate_n(iv.begin(),5,rand);//条件填充
	//it = remove_if(iv.begin(),iv.end(),findCondition);//删除条件内的元素,依次填充到头,然后返回一个it,这个it是尾部,实际的iv.size()是不变的
	cout<<"unique 前的值"<<endl;
	for_each(iv.begin(),iv.end(),display<int>());
	cout<<endl;
	it = unique(iv.begin(),iv.end());//只是把唯一的元素全部移到了前面,iv的值并不改变
	cout<<"unique 后的值"<<endl;
	for_each(iv.begin(),iv.end(),display<int>());
	cout<<endl;
	for(it2=iv.begin();it2!=it;it2++)
	{
		cout<<*it2<<endl;
	}
	cout<<iv.size()<<" 2 "<<iv2.size()<<endl;
	unique_copy(iv.begin(),iv.end(),back_inserter(iv2));//将结果拷贝到iv2,并且iv2要有足够的空间,所以这里需要back_inserter。
	for_each(iv2.begin(),iv2.end(),display<int>());
	cout<<endl;
	//排序算法
	
	//转换成堆,排序
	make_heap(iv.begin(),iv.end());
	sort_heap(iv.begin(),iv.end());

	sort(iv.begin(),iv.end());//等同于sort(vect.begin(), vect.end(), less<int>() );降序排序sort(iv.begin(),iv.end(),greater<int>());
	stable_sort(iv.begin(),iv.end());//使相同的值在原来的位置不变,参数传入的是结构体时,会发现两者之间的明显区别
	partial_sort(iv.begin(),iv.begin()+4,iv.end());//取top4
	random_shuffle(iv.begin(),iv.end());//打乱顺序

	for (i=0;i<iv.size();i++)
	{
		cout<<"0+"<<iv[i]<<endl;
	}
	cout<<"元素的数量"<<iv.size()<<endl;

	return 0;
}

 

posted on 2017-09-07 17:32  阮減显  阅读(82)  评论(0编辑  收藏  举报

导航