c++课程总结2(STL)

本文主要介绍了C++中的STL(标准模板库),包括容器的分类和特性:顺序容器(vector、deque、list)、关联容器(set、multiset、map、multimap)以及容器适配器(stack、queue、priority_queue)。重点讲解了容器的常见操作和成员函数,如插入、删除、遍历等。此外,还提到了迭代器的使用,以及在STL中实现查找和排序等算法。
摘要由CSDN通过智能技术生成

STL总结

一、容器概述
1、可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是类模版,分为三种:
(1)顺序容器:vector, deque,list
(2)关联容器:set, multiset, map, multimap
(3)容器适配器:stack, queue, priority_queue
2、对象被插入容器中时,被插入的是对象的一个复制品。放入容器的对象所属的类,往往还应该重载 == 和 < 运算符。
3、顺序容器
(1)vector 头文件 :动态数组。元素在内存连续存放。随机存取任何元素都能在常数时间完成。尾部增删
(2) deque 头文件 :双向队列。元素在内存连续存放。随机存取任何元素都能在常数时间完成。两端增删
list 头文件 :双向链表。元素在内存不连续存放。在任何位置增删元素都能在常数时间完成。不支持随机存取
4、关联容器
(1)元素是排序的
(2)插入任何元素,都按相应的排序规则来确定其位置
(3)在查找时具有非常好的性能
(4)通常以平衡二叉树方式实现,插入和检索的时间都是 O(log(N))
(5)set/multiset 头文件 :set 即集合。set中不允许相同元素,multiset中允许存在相同的元素。
(6)map/multimap 头文件 :map与set的不同在于map中存放的元素有且仅有两个成员变量,一个名为first,另一个名为second, map根据first值对元素进行从小到大排序,并可快速地根据first来检索元素。map同multimap的不同在于是否允许相同first值的元素
在这里插入图片描述
5、容器适配器
(1)stack :头文件 :栈。是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项(栈顶的项),后进先出。
(2)queue 头文件 :队列。插入只可以在尾部进行,删除、检索和修改只允许从头部进行。先进先出。
(3)priority_queue 头文件 :优先级队列,最高优先级元素总是第一个出列。
6、顺序容器和关联容器中都有的成员函数
(1)begin 返回指向容器中第一个元素的迭代器
(2)end 返回指向容器中最后一个元素后面的位置的迭代器
(3)rbegin 返回指向容器中最后一个元素的迭代器
(4)rend 返回指向容器中第一个元素前面的位置的迭代器
(5)erase 从容器中删除一个或几个元素
(6)clear 从容器中删除所有元素
7、顺序容器的常用成员函数
(1)front :返回容器中第一个元素的引用
(2)back : 返回容器中最后一个元素的引用
(3)push_back : 在容器末尾增加新元素
(4)pop_back : 删除容器末尾的元素
(5)erase :删除迭代器指向的元素(可能会使该迭代器失效),或删除一个区间,返回被删除元素后面的那个元素的迭代器
二、迭代器(iterator)
1、遍历STL容器内全部或部分元素的对象,指出特定位置
(1)用于指向顺序容器和关联容器中的元素
(2)迭代器用法和指针类似
(3)有const 和非 const两种
(4)通过迭代器可以读取它指向的元素
(5)通过非const迭代器还能修改其指向的元素
(6)定义一个容器类的迭代器的方法可以是:
容器类名::iterator 变量名;
容器类名::const_iterator 变量名;(const类型迭代器)
(7)访问一个迭代器指向的元素:* 迭代器变量名
(8)迭代器上可以执行 ++ 操作, 以使其指向容器中的下一个元素。
例:

#include <vector>
#include <iostream>
using namespace std;
int main() {
	vector<int> v; //一个存放int元素的数组,一开始里面没有元素
	v.push_back(1); v.push_back(2); v.push_back(3);
	v.push_back(4);
	vector<int>::const_iterator i; //常量迭代器
	for( i = v.begin();i != v.end();++i )
		cout << * i << " ";
		cout << endl;
	vector<int>::reverse_iterator r; //反向迭代器
	for( r = v.rbegin();r != v.rend();r++ )
		cout << * r << " ";
		cout << endl;
}

输出:

1 2 3 4
4 3 2 1

2、vector容器
模拟动态数组,随机访问
元素可以是任意类型,但必须具备赋值和拷贝能力。
遍历vector:

vector<int> v(10);
    int i;
    for(i = 0;i < v.size() ; i ++){
	     cout << v[i]; //根据下标随机访问
    }
    cout<<endl;
    vector<int>::const_iterator x;
    for( x = v.begin(); x != v.end ();++x)
	     cout << * x;
输出:
0000000000
0000000000

3、算法
STL中提供能在各种容器中通用的算法,比如查找,排序
(1)find() 顺序查找
在容器中查找一个元素,并返回一个指向该元素的迭代器

int array[10] = {10,20,30,40};
	vector<int> v;
	v.push_back(1); v.push_back(2);
	v.push_back(3); v.push_back(4);
	vector<int>::iterator p;
	p = find(v.begin(),v.end(),3);
	if( p != v.end())
		cout << * p << endl; 
	p = find(v.begin()+1,v.end()-2,1);//区间查找
	if( p != v.end())
		cout << * p << endl;
输出:
3
3

在这里插入图片描述

三、map/multimap
使用平衡二叉树管理元素
元素包含两部分(key,value),key和value可以是任意类型
必须包含的头文件#include
1、multimap的声明

template<class Key, class T, class Pred = less<Key>,class A = allocator<T> >
class multimap {.
typedef pair<const Key, T> value_type;
…….
}; 

(1)multimap中的元素由 <关键字,值>组成,每个元素是一个pair对象,关键字就是first成员变量,其类型是Key。
(2)multimap 中允许多个元素的关键字相同。元素按照first成员变量从小到大
排列,缺省情况下用 less 定义关键字的“小于”关系。
例:求关键字等于某值的元素个数

typedef multimap<int,double,less<int> > m;
	m pairs;
	pairs.insert(m::value_type(15,2.7));
	pairs.insert(m::value_type(15,99.3));
	cout << pairs.count(15) << endl; 
输出:
3

2、map
(1)声明

template<class Key, class T, class Pred = less<Key>,
class A = allocator<T> >
class map {.
typedef pair<const Key, T> value_type;
…….
};

(2)map 中的元素都是pair模板类对象。关键字(first成员变量)各不相同。元素按照关键字从小到大排列,缺省情况下用 less,即“<” 定义“小于”
(3)map的[ ]成员函数,若pairs为map模版类的对象,pairs[key]返回对关键字等于key的元素的值(second成员变量)的引用。若没有关键字为key的元素,则会往pairs里插入一个关键字为key的元素,其值用无参构造函数初始化,并返回其值的引用.

find(key)返回键值等于key的第一个元素,找不到返回end。
lower_bound(key)返回键值大于等于key的第一个元素,upper_bound(key)返回键值大于key的第一个元素。用于区间查找
equal_range(key)返回键值等于key的元素区间。
四、set/multiset
使用平衡二叉树管理元素
集合(Set)是一种包含已排序对象的关联容器
必须包含的头文件#include
1、multiset的定义:

template<class Key, class Pred = less,
class A = allocator >
class multiset { …… };

(1)Pred类型的变量决定了multiset 中的元素,“一个比另一个小”是怎么定义的。multiset运行过程中,比较两个元素x,y的大小的做法,就是生成一个 Pred类型的变量,假定为 m,若表达式m(x,y) 返回值为true,则 x比y小。
(2)Pred的缺省类型是 less
2、multiset 的成员函数
(1)iterator find(const T & val);在容器中查找值为val的元素,返回其迭代器。如果找不到,返回end()。
(2)iterator insert(const T & val); 将val插入到容器中并返回其迭代器。
(3)void insert( iterator first,iterator last); 将区间[first,last)插入容器。
(4)int count(const T & val); 统计有多少个元素的值和val相等。
(5)iterator lower_bound(const T & val);查找一个最大的位置 it,使得[begin(),it) 中所有的元素都比 val 小。
(6)iterator upper_bound(const T & val);查找一个最小的位置 it,使得[it,end()) 中所有的元素都比 val 大。
(7)pair<iterator,iterator> equal_range(const T & val);同时求得lower_bound和upper_bound。
(8)iterator erase(iterator it);删除it指向的元素,返回其后面的元素的迭代器
3、用法
multiset a;就等价于multiset<A, less> a;插入元素时,multiset会将被插入元素和已有元素进行比较。
set排序方式有两种:一个是使用重载的小于号,一个是使用函数对象。
4、set
1)set的定义:

template<class Key, class Pred = less,
class A = allocator >
class set { … }

(2)插入set中已有的元素时,忽略插入
(3)set中不允许有key相同的元素

#include <iostream>
#include <set>
using namespace std;
int main() {
	typedef set<int>::iterator IT;
	int a[5] = { 3,4,6,1,2 };
	set<int> se(a,a+5); //  1 2 3 4 6
	pair< IT,bool> result;
	result = se.insert(5); // 变成 1 2 3 4 5 6
	if( result.second ) //插入成功
	cout << * result.first << endl; 
	return 0;
}
输出:
5

学习感受

STL通过模板编程,带来很多方便,要了解其功能实现的内部工作原理,让我们可以更好的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值