STL学习笔记(八) 标准容器(类模板)共性

标准容器包括: vector deque list set map multiset multimap

这篇里面讲的函数 它们都可以用

1 构造函数:

拥有 无参构造 拷贝构造 区间构造(两个迭代器表示的两个位置,半开半闭)析构

2 拥有内部类型 - 迭代器,表示位置(封装了一个指针,使用的方法和指针差不多)

(1) 正向迭代器 iterator,const_iterator
 .begin() 返回指向第一个元素的迭代器 
.end() 返回指向超越最后一个位置的迭代器

2 反向迭代器 reverse_iterator ,const_reverse_iterator,可以按相反顺序返回元素
.rbegin() 返回 指向倒数第一个元素的迭代器
.rend() 返回 指向倒数最后一个元素之后位置的迭代器
标准容器的迭代器都支持  *  , -> ,= ,++, !=, == ,-- 


3 函数

插入 .insert(pos,.element) pos表示插入位置,是个迭代器 
删除  .erase(pos)  .erase(pos_beg,pos_end)
清除 .clear()
大小 .size() .max_size() .empty()
交换  .swap(c2)   非成员函数swap(c1,c2)  (成员函数会更好)
运算符: = > < >= <= == !=



4 容器分类:

(1)标准容器 (本篇讲它们的共性 )
{
序列式 : vector deque list
关联式: set map multiset multimap
}

(2)特殊容器:
{
stack 栈
queue  队列
priority_queue 优先队列
}


5 例子(以vector为例)

#include <iostream>
using namespace std;
#include <vector> //容器名和头文件名是一样的
#include <algorithm>

//输出指定区间中的所有数据 含头不含尾
template<typename T>
void show(T beg,T end)
{
	while(beg != end)
	{
		cout << *beg++  << ' ';
	}
	cout << endl;
}


int main()
{
	int a[5] = {55,22,44,33,11};
	vector<int> vi (a,a+5 ); //区间构造函数, 只是在复制了一份值到容器中,不会改变a
	cout << vi.size() << endl;//5
	sort(vi.begin() ,vi.end()); //使用通用算法排序(<algorithm>)
	
	vector<int>::iterator b = vi.begin(); //内部类型迭代器
	cout << "show vi: " << endl;
	show(vi.begin() ,vi.end() );
	cout << "show a: " << endl;
	show(a,a+5);

	cout << "show reverse vi: " << endl;
	show(vi.rbegin() , vi.rend()); // ++是从尾到头移动
	
	vi.insert(vi.begin(), 66); //插在最前面
	show(vi.begin() ,vi.end() ); //66 11 22 33 44 55 
	
	b= vi.begin();
	vi.insert(++++b,77); //插在第三个前面
	show(vi.begin() ,vi.end() );//66 11 77 22 33 44 55 
	
	cout << "size:" << vi.size() << ' ' << "maxsize:" <<  vi.max_size() << endl;  //size:7 maxsize:1073741823
	
	vi.erase(--vi.end()); // 删除最后一个数据,因为.end()不是其中元素
	show(vi.begin() ,vi.end() ); //66 11 77 22 33 44
	
	vi.erase(++++vi.begin(), --vi.end()); //删除从第三个到最后一个前面的(含第三个,不含最后一个)
	show(vi.begin() ,vi.end() );//66 11 44
	
	vector<int> v2(a,a+5);
	cout << "v2:" ;
	show( v2.begin(),v2.end() );

	cout << "swap--------------------------" << endl; //效率最高
	vi.swap(v2);
	cout << "vi : " ;
	show( vi.begin(),vi.end() );
	cout << "v2 : ";
	show( v2.begin(),v2.end() );
	
	cout << "swap--------------------------" << endl;//使用特化 效率略低
	swap(vi,v2);
	cout << "vi : " ;
	show( vi.begin(),vi.end() );
	cout << "v2 : ";
	show( v2.begin(),v2.end() );
	
	cout << "swap--------------------------" << endl; //效率最低
	vector<int> t =vi;
	vi = v2;
	v2 = t;
	cout << "vi : " ;
	show( vi.begin(),vi.end() );
	cout << "v2 : ";
	show( v2.begin(),v2.end() );

	
	vi.clear();
	cout << "after clear, size:" << vi.size()  << endl;
	show( vi.begin(),vi.end() ); //空
	
	/*vector 仅有的 .capacity()*/ //这个下篇会写的
	cout << "当前v2容量:" <<  v2.capacity() << endl; //5 最开始分配了5个元素的
	cout << "当前元素个数" << v2.size() << endl;	//3 删了2个只剩3个
	cout << "当前vi已分配空间:" <<  vi.capacity() << endl; 

	
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值