STL标准模板库4(关联容器)
STL标准模板库

STL标准模板库(standard template library)容器类(可以存储其他对象的对象),算法(一系列封装好的函数),迭代器(用于遍历操作的类)容器可以直接存储对象,也可以存储对象的指针。
成熟的程序员喜欢使用间接存储。
容器主要包括两种类型:序列类(一般是线形存储)和关联类(一般是非线性存储)。
一、序列式容器vector ----- 数组可变长不提供pop_front()删除头元素的函数list ----- 链表(1)Vector v[1000]当越界的时候,会出现段错误使用vector需要导入头文件vectorv.at(1000) 越界的时候,会抛出out_of_range的异常,在程序中捕获v.size() 返回长度,可利用这个循环迭代v.empty()判断容器是否为空iterator迭代器:可以做取*操作*iteratoriter->name <=> (*iter).nameiter++v.begin() 指向数组的开始v.end() 指向数组最后一个元素的后面,是一个结束标志如:对一个vector进行迭代输出vector<int> v1;v1.push_back(1);//假设添加了很多int元素vector<int>::iterator it; //iterator是vector的一个内部类,要标识出迭代器类型for( it = v1.begin(); it < v1.end(); it++ )cout << *it << endl;v.insert(iter,5); //在iter所指的元素前面插入5v.insert(iter,5,100); //在iter所指的元素前插入5个100这样的插入操作,会造成原来的iterator失效,对起重新赋值,可以保证继续使用(2)list使用list需要导入头文件list不能做at()多了push_front(),pop_front()iter不能做加n操作使用于做频繁的插入删除操作二、关联式容器(1)map使用map需要导入头文件map适合根据键查找值的操作存储上按照键值排序,并且key值唯一map<int,Student> m;Student s1( 1 ,"lily" );//创建一个pair,并存到map的第一个位置中,value_type是map的静态函数m.insert( map<int,Student>::value_type(s.getId(),s1)) ;Student s2( 4, "licy”);m.insert( map<int,Student>::value_type(s2.getId(),s)) ;map<int,Student>::iterator it ;for(it=m.begin();it!=m.end();it++ ){cout<< it->first << " "<<it->second;cout<<endl ;}在map中用[]查询,并不安全m.find(1); // 查询key为1的value返回一个iter,指向找到的那个键值对,如果没找到,iter会与iter.end()的值相等(2)multimap其中的key允许重复使用multimap需要导入头文件multimap,没有头文件multimap查找:multimap<int ,Student>::iterator it ;multimap<int ,Student>::iterator lt ;multimap<int ,Student>::iterator ut ;lt = m.lower_bound( 1 );ut = m.upper_bound( 1 );for( it=lt ; it != ut ; it++ ){cout<<it->first <<" " ;cout<<it->second <<endl;}(3)set使用set需要导入头文件setset中不能插入重复数据,相当于map中的key插入数据的时候不必指定位置因为与map中的key一致,仍保留着排序的特性(4)multiset使用set需要导入头文件set,没有头文件multiset允许重复,与vector类似,唯一不同的就是保留着排序的特性三、容器补充说明容器共同的特征:1. 构造函数(无参)2. 析构函数3. 赋值运算符重载4. 比较运算符重载> < >= <= == !=5. 插入函数insert(pos(位置),elem)6. 删除函数:erase(pos)和erase(begin p,end p),用来删除容器中的一个或多个元素,其中pos是要删除元素的位置,begin p和end p则指一个区间。
stl标准模板库

stl标准模板库STL(Standard Template Library)标准模板库是C++标准库的一部分,它提供了一系列通用的模板类和函数,用于实现常见的数据结构和算法。
STL的设计目标是提供高效、灵活、易用的数据结构和算法,使得C++程序员能够更加方便地进行程序开发。
STL包括多个组件,其中最重要的三个组件是容器(Containers)、算法(Algorithms)和迭代器(Iterators)。
容器用于存储数据,算法用于对数据进行操作,而迭代器则提供了对容器中元素的访问方式。
这三个组件共同构成了STL的核心,为C++程序员提供了丰富的数据结构和算法库。
在STL中,容器包括了诸如vector、list、deque、set、map等多种数据结构。
这些容器提供了不同的数据存储方式和操作接口,可以满足各种不同的需求。
例如,vector是一个动态数组,可以快速随机访问元素;list是一个双向链表,可以高效地进行插入和删除操作;而set和map则是基于红黑树实现的关联容器,提供了快速的查找和插入操作。
除了容器之外,STL还提供了丰富的算法库,包括排序、查找、合并、遍历等各种算法。
这些算法可以直接应用于STL容器,使得程序员能够方便地对数据进行各种操作。
例如,通过调用标准库中的sort函数,可以对vector、list等容器进行排序;通过调用find函数,可以在容器中进行快速查找操作;而通过调用for_each函数,可以对容器中的每个元素进行遍历操作。
在STL中,迭代器扮演着非常重要的角色。
迭代器提供了一种统一的访问容器元素的方式,使得算法能够独立于容器而操作。
通过迭代器,算法可以对容器中的元素进行顺序访问,而不需要关心容器的具体实现方式。
这种分离的设计使得STL具有很高的灵活性,使得容器和算法能够相互独立地演化和扩展。
除了容器、算法和迭代器之外,STL还包括了函数对象、适配器、空间配置器等多种组件,为程序员提供了丰富的工具和接口。
STL的熟悉与使用

STL的熟悉与使用STL(Standard Template Library)是C++标准库中提供的一个功能强大的通用模板库,它包含了许多常用的数据结构和算法。
STL的熟悉与使用对于C++程序员来说非常重要,可以极大地提高开发效率和代码的质量。
本文将介绍STL的基本概念、常用数据结构和算法,以及如何进行STL的使用。
STL的基本概念:1. 容器(Containers):STL中的容器是用来存储数据的类模板,包括序列容器(vector、deque、list)和关联容器(set、map、multiset、multimap)。
容器可以分为序列容器和关联容器,其中序列容器是线性存储的,关联容器是使用键值对存储的。
2. 迭代器(Iterators):STL中的迭代器类似于指针,用来遍历容器中的元素。
迭代器提供了一种统一的访问容器元素的方式,可以通过自增和自减操作实现对容器元素的顺序访问。
3. 算法(Algorithms):STL中提供了大量的算法,包括查找、排序、复制、填充等。
算法可以直接操作容器中的元素,它们是通过迭代器来实现的,所以使用算法需要利用容器的迭代器对容器中的元素进行操作。
4. 函数对象(Function Objects):STL中的函数对象是一种可以像函数一样被调用的对象。
STL中的很多算法需要传递函数对象来实现特定的功能,函数对象可以是函数指针、函数对象类或者是函数对象适配器。
STL常用数据结构和算法:1. vector:动态数组,支持随机访问和快速的尾部插入和删除,可以用来代替数组。
2. list:双向链表,支持快速的插入和删除操作,但不支持随机访问。
3. set:集合,其中的元素是有序且独一无二的,可以进行插入、删除和查找操作,内部通过红黑树实现。
4. map:映射,包含一系列的键值对,其中的键是有序且独一无二的,可以进行插入、删除和查找操作,内部通过红黑树实现。
5. sort:对容器中的元素进行排序,内部使用快速排序算法。
第12章 标准模板库STL

(1)向量的定义和初始化 vector类有4种构造函数: vector(); 默认构造函数,它构造一个空的vector,其大小为零。 例如, vector <elementType> vecList; 使用默认构造函 数创建一个没有任何元素的空向量vecList。vecList. size()=0。 vector(size_type n,const T&value=T()); n const 构造一个初始放入n个值为value的元素的vector。第1个 参数为vector初始化的大小,第2个参数是vector中每个对象的 初始值,默认为T()构造的对象。 例如, vector <elementType> vecList(size); 创建一个 大小为size的向量vecList,并使用elementType类的默认构造 函数初始化该向量。 vector <elementType> vecList(n,elem); 创建一个大小 为n的向量vecList,该向量中所有的n个元素都初始化为elem。
STL函数适配器 STL函数对象
STL最主要的一个特点:数据结构和算法的分离。 容器是像链表,向量、栈、队列之类的数据结构,并按类 模板方式提供; 算法是函数模板,用于操作容器中的数据。 由于STL以模板为基础,所以能用于任何数据类型和结构。 实际上,可以认为STL是以容器和迭代器为基础的一种泛 型算法(Generic Algorithms)库。 所谓泛型(Genericity)是指能够在多种数据类型上进行 操作,在泛型化程序设计思想里,大部分基本算法被抽象,被 泛化,独立于与之对应的数据结构,用于以相同或相近的方式 处理各种不同情形。
包含vector类的头文件是<vector>。所以,如果要在程 序里使用向量容器,就要在程序中包含下面语句: #include <vector> 在定义向量类型对象时,必须指定该对象的类型。 例如: vector<int> intVec; 将intVec声明为一个元素类型为int的向量容器对象。 vector<string> stringVec; 将stringVec声明为一个元素类型为string的向量容 器对象。 Vector提供的成员函数主要列举如书296页表12-1所示。
stl标准模板库 pdf

stl标准模板库 pdfSTL(Standard Template Library)标准模板库是C++语言中的一个重要组成部分,它提供了许多常用的数据结构和算法,为程序员提供了丰富的工具库,能够大大提高程序的开发效率和代码的重用性。
本文将介绍STL标准模板库的一些基本概念和常用功能,并提供相关的PDF文档供大家参考学习。
STL标准模板库主要包括容器(Containers)、迭代器(Iterators)、算法(Algorithms)三大部分。
其中容器用于存储数据,迭代器用于遍历容器中的数据,算法用于对容器中的数据进行各种操作。
STL的设计思想是将数据结构和算法分离,使得它们能够独立地进行组合和复用,从而大大提高了程序的灵活性和可维护性。
在STL标准模板库中,容器是其中最重要的部分之一。
STL提供了多种类型的容器,包括序列容器(如vector、list、deque)、关联容器(如set、map、multiset、multimap)以及无序关联容器(如unordered_set、unordered_map、unordered_multiset、unordered_multimap)。
每种容器都有其特定的特性和适用场景,程序员可以根据实际需求选择合适的容器来存储数据。
除了容器之外,STL标准模板库还提供了丰富的迭代器,用于遍历容器中的数据。
迭代器可以被看作是一个指向容器中元素的指针,它提供了统一的访问接口,使得程序员可以使用相同的方式来访问不同类型的容器。
STL中的算法通常以迭代器作为参数,通过迭代器来对容器中的数据进行各种操作,如查找、排序、删除、替换等。
在实际开发中,STL标准模板库的算法部分也是非常重要的。
STL提供了大量的算法,包括查找算法(如find、count、equal_range)、排序算法(如sort、partial_sort、nth_element)、修改算法(如copy、replace、swap)、数值算法(如accumulate、inner_product、partial_sum)等。
stl标准模板库

stl标准模板库STL标准模板库。
STL(Standard Template Library)标准模板库是C++标准库的一部分,它提供了一系列的通用模板类和函数,用于实现常见的数据结构和算法。
STL的设计理念是基于泛型编程,通过模板来实现数据结构和算法,使得代码具有高度的通用性和可重用性。
STL包含了多种容器类、迭代器、算法和函数对象等组件,为C++程序的开发提供了丰富的工具和资源。
容器类是STL中最基本的组件之一,它提供了各种不同类型的数据结构,如vector、list、deque、set、map等。
这些容器类可以方便地存储和管理数据,使得程序员能够更加专注于算法的实现,而不必关心数据的存储和管理细节。
通过使用STL容器类,程序员可以快速地构建出复杂的数据结构,从而提高代码的可读性和可维护性。
除了容器类之外,STL还提供了丰富的算法和函数对象,用于对容器中的数据进行操作和处理。
这些算法包括了排序、查找、遍历、复制、删除等常见操作,可以大大简化程序员的工作。
此外,STL还引入了迭代器的概念,使得算法能够与容器类解耦,从而更加灵活地进行数据处理。
在STL中,迭代器是一种类似指针的对象,用于遍历容器中的元素。
STL提供了多种不同类型的迭代器,如输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器等。
这些迭代器可以适配不同类型的容器,使得算法能够在不同的数据结构上通用,从而提高了程序的灵活性和可扩展性。
STL的设计思想是将数据结构和算法进行有效地组织和封装,使得程序员能够更加高效地开发和维护代码。
通过STL,程序员可以避免重复造轮子的工作,而是直接使用标准库提供的通用组件,从而提高了代码的质量和效率。
此外,STL还为C++程序员提供了一种统一的编程风格和规范,使得代码更加易读和易懂。
总的来说,STL标准模板库是C++程序开发中不可或缺的重要组成部分,它为程序员提供了丰富的工具和资源,使得代码的开发和维护变得更加高效和简便。
stl容器知识点总结

stl容器知识点总结一、STL容器的种类STL中的容器主要分为序列式容器(Sequence Containers)和关联式容器(Associative Containers)两大类。
序列式容器包括vector、deque、list、forward_list以及array等,而关联式容器则包括set、map、multiset、multimap和unordered_set、unordered_map、unordered_multiset、unordered_multimap等。
1. 序列式容器(1)vector:动态数组,支持随机存取,可以在尾部进行快速插入和删除操作,但在中间和头部的插入和删除效率比较低。
(2)deque:双端队列,支持随机存取,同时在头部和尾部进行快速插入和删除操作,但在中间的插入和删除效率比较低。
(3)list:双向链表,支持在任意位置进行快速插入和删除操作,但不支持随机存取。
(4)forward_list:单向链表,与list相似,但只支持单向的迭代器访问。
(5)array:固定大小的数组,提供与普通数组相似的访问和操作方式。
2. 关联式容器(1)set:集合,不允许重复的元素,并且会自动排序。
(2)map:映射,每个元素都含有一个键值对,并且键是唯一的,自动排序。
(3)multiset:多重集合,允许重复的元素,并且会自动排序。
(4)multimap:多重映射,允许重复的键值对,并且会自动排序。
(5)unordered_set:无序集合,不允许重复的元素,内部实现采用哈希表。
(6)unordered_map:无序映射,每个元素都含有一个键值对,键是唯一的,内部实现采用哈希表。
(7)unordered_multiset:无序多重集合,允许重复的元素,内部实现采用哈希表。
(8)unordered_multimap:无序多重映射,允许重复的键值对,内部实现采用哈希表。
以上就是STL中的主要容器种类,每种容器都有各自的特性和适用场景,在实际开发中需要根据具体的需求选择合适的容器进行使用。
stl标准库

stl标准库STL(Standard Template Library)标准库是C++语言中非常重要的一部分,它提供了许多常用的数据结构和算法,为C++程序员提供了强大的工具,使得编程变得更加高效和简洁。
在本文中,我们将深入探讨STL标准库的各个方面,包括其组成部分、常用的数据结构和算法,以及如何在实际项目中应用STL标准库。
STL标准库由多个组件组成,其中最重要的三个组件分别是容器(Containers)、算法(Algorithms)和迭代器(Iterators)。
容器是用来存储数据的数据结构,常见的容器包括向量(vector)、链表(list)、集合(set)和映射(map)等。
算法是对容器中的数据进行操作的函数集合,包括查找、排序、删除和修改等功能。
迭代器是用来遍历容器中的数据的工具,它提供了统一的访问容器元素的接口,使得算法可以和容器进行无缝的配合。
在实际项目中,STL标准库可以极大地提高程序员的工作效率。
以向量(vector)为例,当我们需要一个动态数组来存储一系列数据时,使用STL中的向量可以避免手动管理内存和处理数组扩容的问题,大大简化了代码的编写。
另外,STL中提供的丰富的算法库可以帮助我们快速实现各种常见的数据操作,比如查找最大值、计算平均值、排序等,而不需要重复造轮子。
除了提供基本的数据结构和算法外,STL标准库还提供了一些高级的组件,比如函数对象(Functors)、适配器(Adapters)和迭代器适配器(Iterator Adapters)。
函数对象是可调用对象,它可以像函数一样被调用,常用于自定义排序和查找等算法中。
适配器是用来将一种容器或算法转换成另一种容器或算法的工具,它可以帮助我们复用现有的代码,提高代码的可维护性。
迭代器适配器则是用来扩展迭代器的功能,比如反向迭代器(reverse iterator)可以让我们从容器的末尾向前遍历数据。
总的来说,STL标准库是C++程序员必备的利器,它提供了丰富的数据结构和算法,可以极大地提高程序员的工作效率,减少重复劳动。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
list
• List本质上就是一个双向链表 • list 迭代器 operator*, operator++,operator— • list提供的是 Bidirectional Iterators 双向存取迭代器
list常用方法
• • • • • • • • • • • • • • • • • • • • iterator begin(); iterator end(); reverse_iterator rbegin(); reverse_iterator rend(); void resize(size_type n, T x = T()); size_type size() const; size_type max_size() const; bool empty() const; reference front(); reference back(); void push_front(const T& x); void pop_front(); void push_back(const T& x); void pop_back(); void assign(const_iterator first, const_iterator last); void assign(size_type n, const T& x = T()); iterator insert(iterator it, const T& x = T()); void insert(iterator it, size_type n, const T& x); void insert(iterator it, const_iterator first, const_iterator last); void insert(iterator it, const T *first, const T *last); • • • • • • • • • • • • • • • • iterator erase(iterator it); iterator erase(iterator first, iterator last); void clear(); void swap(list x); void splice(iterator it, list& x); void splice(iterator it, list& x, iterator first); void splice(iterator it, list& x, iterator first, iterator last); void remove(const T& x); void remove_if(binder2nd<not_equal_to<T> > pr); void unique(); void unique(not_equal_to<T> pr); void merge(list& x); void merge(list& x, greater<T> pr); void sort(); void sort(greater<T> pr); void reverse();
顺序容器 vector list 支持快速随机访问 支持快速插入/删除
deque
双端队列
顺序容器适配器 stack queue 栈 队列
priority_queue
有优先级管理的队列
3.1 顺序容器的定义
容器内元素的类型约束
• 元素类型必须支持赋值运算 • 元素类型的对象必须可以复制 • 元素类型应支持相应的操作
map是键—值对的集合。
map定义的类型
map<K,V >::key_type map<K, V>::vlaue_type
在map容器中,用做索引的键的类型 一个pair类型,它的first元素具有const map<K,V >::key_type类型,而second元素则为map<K, V>::mapped_type类型
m.insert(beg, end)
m.insert(iter, e)
map_插入
ret存储的insert函数返回的pair对象 ret.first从insert返回的pair对象中获取map迭代器 ret.first->second对该迭代器进行解引用,获得一个 value_type类型的对象。这个对象同样是pair类型的,它 的second成员成为我们所添加的元素的值部分。
map_查找并读取
m.count(k) m.find(k)
返回m中k是否存在,只返回0或者1 返回指向K的迭代器
map_删除元素
顺序容器类型
将单一类型元素聚集起来成为容器,任何根据位置来存储和访问这些元素,这就是顺序容器 顺序容器的元素排列次序和元素值没有关系,而是由元素添加到容器中的次序决定
deque常用方法
• • • • • • • • • • • • • • • • • • • • iterator begin(); const_iterator begin() const; iterator end(); iterator end() const; reverse_iterator rbegin(); const_reverse_iterator rbegin() const; reverse_iterator rend(); const_reverse_iterator rend() const; void resize(size_type n, T x = T()); size_type size() const; size_type max_size() const; bool empty() const; reference at(size_type pos); const_reference at(size_type pos) const; reference operator[](size_type pos); const_reference operator[](size_type pos); reference front(); const_reference front() const; reference back(); const_reference back() const;
map<K, V>::mapped_type 键所关联的值的类型
问题
对于以int型对象为索引关联vector<int>型对象的map容器 ,它的mapped_type, key_typr. value_type分别是什么 ?
写一个表达式,使用map的迭代器给其元素赋值
使用下标给map添加对象
1 在word_count中查找“world”的元素,没有找到 2 生成一个新的键-值对,他的键是const string类型的对 象,保存“world”。而它的值才采用值初始化,这意味本 例中值为0 3 将这个行的键-值对插入到word_count中 4 读取新插入的元素,并将它的值赋值为2
•
• • • • •
• •
deque
• deque则是一种双向开口的连续空间。所谓双向开口,意思 是可以在头尾两端分别做元素的插入和删除操作 • deque没有所谓容量(capacity)概念,因为它是动态地以 分段连续空间组合而成,随时可以增加一段新的空间并连 接起来,不同于vector的线性增长。 • 虽然deque也提供了Random Access iterator,但它的迭代 器并不是普通指针,其复杂度和vector也不是一个数量级 上的,这当然也会影响到运算的各个层面。因此,除非必 要,我们应 尽可能选择使用vector而非deque。对deque进 行的排序操作,为了最高效率,可将deque先完整复制到一 个vector,将 vector(利用STL Sort算法),再复制回deque。
容器类型
• 顺序容器 • 关联容器
顺序容器
• 顺序容器中所有的元素在容器中的物理位置 都是按照特定的次序进行存放的,区别于关 联容器的是顺序容器中的元素的位置都是既 定的。 • STL标准的顺序容器包括 vector、list、deque。
vector的特点
ห้องสมุดไป่ตู้
• vector与array的相同点和不同点 • vector 迭代器所需要的操作行 • 为如 operator*,operator>,operator++,operator-,operator+, operator-,operator+=,operator-= • 所以,vector 提供的是 Random Access Iterators
下标操作符的使用和意义
下标操作符返回的是一个mapped_type类型的值
练习
编写程序,设计并输出所读入单词所出现的次数 解释下面程序的功能:
哪些类型可用作map容器对象的下标?下标操作符返回的又 是什么类型?给出一个具体的例子说明,定义一个map对象 ,指出哪些类型可以用作其下标,以及下标操作符返回的 类型?
STL
关联容器
目标
关联容器的概念 map容器 set容器 multimap和multiset类型
关联容器与顺序容器的区别
pair类型
练习
编写程序读入一系列的string和int型数据,将每组数据都 存储在一个pair对象中,容纳后将这些pair对象存储在一 个vector容器中。
map类型
• • • • • • • • • • • • • • void push_front(const T& x); void pop_front(); void push_back(const T& x); void pop_back(); void assign(const_iterator first, const_iterator last); void assign(size_type n, const T& x = T()); iterator insert(iterator it, const T& x = T()); void insert(iterator it, size_type n, const T& x); void insert(iterator it, const_iterator first, const_iterator last); iterator erase(iterator it); iterator erase(iterator first, iterator last); void clear(); void swap(deque x);