| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> “C++学习笔记“ STL2_容器 -> 正文阅读 |
|
[系统运维]“C++学习笔记“ STL2_容器 |
目录 reverse_interator、const_reverse_interator rbegin()、rend()、crbegin()、crend() 二、容器 定义:容器(container)用于存放数据的类模板。可变长数组、链表、平衡二叉树等数据结构在?STL?中都被实现为容器。 1. 容器的分类与基本函数STL?对定义的通用容器分三类:顺序性容器、关联式容器和容器适配器。 顺序容器顺序容器有以下三种:可变长动态数组 vector、双端队列 deque、双向链表 list。 关联容器关联容器有以下四种:set、multiset、map、multimap。关联容器内的元素是排序的。插入元素时,容器会按一定的排序规则将元素放到适当的位置上,因此插入元素时不能指定位置。 容器适配器除了以上两类容器外,STL 还在两类容器的基础上屏蔽一部分功能,突出或增加另一部分功能,实现了三种容器适配器:栈 stack、队列 queue、优先级队列 priority_queue。 容器都是类模板。它们实例化后就成为容器类。用容器类定义的对象称为容器对象。 例如,
成员函数所有容器都有以下两个成员函数:
2.?容器定义的类型与构造函数参数interator、const_iterator?
注意:上面所说的常量是指常量容器,而不是容器内的元素为常量 建议:如果我们只是简单的遍历容器元素或者对象是常量时,一般使用const_iterator比较合适 C++11引进了两个新函数,分别为cbegin()、cend(),其两者的功能类似于begin()、end() C++11标准之前,iterator与const_iterator都使用begin()、end()两个辅助函数遍历容器。 C++11标准之后,const_iterator既可以使用可以使用begin()、end(),也可以使用cbegin()、cend()。但是iterator还是只能使用begin()、end()
reverse_interator、const_reverse_interator功能与interator、const_iterator均相同,但是用法不一样
用法的原理与interator、const_iterator是相同的 但是rbegin()、rend()分别指向容器元素的最后一个位置与第一个元素的前一个位置
begin()、end()、cbegin()、cend()4者都是容器的成员函数 begin()、end()代表容器的特殊位置,分别为元素的第一个位置与最后一个元素的下一个位置 下面比如是vector的一个模型,则begin()、end()分别代表一下位置
rbegin()、rend()、crbegin()、crend()这四者的原理与begin()、end()、cbegin()、cend()是相同的,也都是容器的成员函数
但是rbegin()、rend()分别代表最后一个元素与第一个元素的前一个位置 reference, const_reference引用(Reference)C语言中,使用指针(Pointer)可以间接获取、修改某个变量的值,C++中,使用引用可以起到跟指针类似的功能。
常引用(Const Reference)引用被const修饰,这样就无法通过引用修改数据了,被称为常引用。
pointer, const_pointer
size_type
value_type
key_type? ? ? ? pair<const Key, T>
mapped_type
key_compare
value_compare
конструктор без параметров
(n
x = T())
vector<int> a{1, 2, 4};
vector<int> a = {1, 2, 4};
3. 容器内的函数
operator=
(other)
iterator
begin
()
void
clear
()
bool
empty
() const
iterator
end
()
size_type
max_size
() const
reverse_iterator
rbegin
()
reverse_iterator
rend
()
size_type
size
() const
void
swap
(other)
void
assign
(n, x)
void
assign
(InIterFirst, InIterLast)
void
assign
(init_list)
STL中不同容器之间是不能直接赋值的,assign()可以实现不同容器但相容的类型赋值,如:
reference
operator[](n)? ? ? ?{vector, deque, string}
reference
at(n)? ? ? ? ? ? ? ? ? ? ?{vector, deque, string}
reference
back()? ? ? ? ? ? ? ? ? {vector, deque, list, string}
reference
front
() ? ? ? ? ? ? ? ? ?{
vector, deque, list, string(C++11)}
size_type
capacity
() const ?{
vector, string}
T* data()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {vector(C++11), string}
iterator
emplace(pos, arg1, arg2, …)??{vector(C++11), deque(C++11), list(C++11)}
void
emplace_back(arg1, arg2, …)? {vector(C++11), deque(C++11), list(C++11)}
void
emplace_front(arg1, arg2, …)??{deque(C++11), list(C++11)}
iterator
erase
(pos)
iterator
erase
(first, last)
iterator
insert
(pos, x)
void
insert
(pos, n, x)
void
insert
(pos, InIterFirst, InIterLast)
iterator
insert
(pos, InIterFirst, InIterLast)
iterator
insert
(pos, init_list)
void
pop_back()? ? {vector, deque, list, string(C++11) }
void
pop_front()? ? {deque, list}
void
push_back
(x)
void
push_front(x)?{deque, list}
void
reserve(n)? ? ? ? {vector, string}
void
resize
(n, x = T())
void
shrink_to_fit()? {vector(C++11), deque(C++11), string(C++11)}
List特有函数
void
merge
(lst
[
, comp
]
)
void
remove
(x)
void
remove_if
(pred)
void
reverse
()
void
sort
(
[
comp
]
)
void
splice
(pos, lst)
void
splice
(pos, lst, pos_lst)
void
splice
(pos, lst, first_lst, last_lst)
void
unique
(
[
pred
]
)
T&
operator[](k)? {map}
T&
at(k)? ? ? ? ? ? ? ? {map}
size_type
count
(k) const
pair<iterator, bool>
emplace(arg1, arg2, …)?{set(С++11), map(С++11)}
iterator
emplace(arg1, arg2, …) {multiset(С++11), multimap(С++11)}
iterator
emplace_hint
(hintpos, arg1, arg2, …)
pair<iterator, iterator>
equal_range
(k)
size_type
erase
(k)
void
erase
(pos)
void
erase
(first, last)
iterator
erase
(pos)
iterator
erase
(first, last)
iterator
find
(k)
pair<iterator, bool> insert(x)????????????????? {set, map}
iterator insert(x)? ? ? ? ? ? ? ? ?????????????????{multiset, multimap}
iterator
insert(hintpos, x)? ? ? ? ? ? ?{set, map, multiset, multimap}
void
insert
(InIterFirst, InIterLast)
void
insert
(init_list)
key_compare
key_comp
() const
iterator
lower_bound
(k)
iterator
upper_bound
(k)
value_compare
value_comp
() const
4. 容器内的常规操作
4.1 顺序(序列)容器 顺序容器插入操作: 最重要的函数是insert,有下面三种重载形式:
容器类型只会提供能用常数复杂度实现的函数,因此,vector提供push_back但没有push_front,而list和deque同时提供push_front和push_back。 顺序容器的清除操作:
(2)deque (3)list 4.2 关联容器 插入操作: insert的行为与容器是否允许重复项目有关。类型set、map、unordered_set、unordered_map要求唯一键,而multiset、multimap、unordered_multiset和unordered_multiset允许重复键。
erase: (2)multiset (3)map (4)multimap 4.3 容器适配器 使用中需要考虑的一些因素 适合用list 2、查找速度 对于关联容器,存储的时候存储的是一棵红黑树,总是能达到对数时间复杂度(O(logN))的效率,因为关联容器是按照键值排好序的。 3、内存是否连续 4、元素的排序 具体使用 1、如果需要高效的随机存取,不在乎插入和删除的效率,使用vector; 2、如果需要大量的插入和删除元素,不关心随机存取的效率,使用list; 3、如果需要随机存取,并且关心两端数据的插入和删除效率,使用deque; 4、如果打算存储数据字典,并且要求方便地根据key找到value,一对一的情况使用map,一对多的情况使用multimap; 5、如果打算查找一个元素是否存在于某集合中,唯一存在的情况使用set,不唯一存在的情况使用multiset 反向迭代器? 反向迭代器是一种反向遍历容器的迭代器。也就是,从最后一个元素到第一个元素遍历容器。反向迭代器将自增(和自减)的含义反过来了:对于反向迭代 ??????? 回想一下,所有容器都定义了 begin 和 end 成员,分别返回指向容器首元素和尾元素下一位置的迭代器。容器还定义了 rbegin 和 rend 成员,分别返回指向容器尾元素和首元素前一位置的反向迭代器。与普通迭代器一样,反向迭代器也有常量(const)和非常量(nonconst)类型。图 11.1 使用一个假设名为 vec 的 vector 类型对象阐明了这四种迭代器之间的关系。 图?1 比较 begin/end 和 rbegin/rend 迭代器 ??????假设有一个 vector 容器对象,存储 0-9 这 10 个以升序排列的数字:
下面的 for 循环将以逆序输出这些元素:
????? 虽然颠倒自增和自减这两个操作符的意义似乎容易使人迷惑,但是它让程序员可以透明地向前或向后处理容器。例如,为了以降序排列 vector,只需向 sort传递一对反向迭代器:
????? 1.反向迭代器需要使用自减操作符
????????如果在 line 中有一个逗号,则 comma 指向这个逗号;否则,comma 的值为 line.end()。在输出 string 对象中从 line.begin() 到 comma 的内容时,从头开始输出字符直到遇到逗号为止。如果该 string 对象中没有逗号,则输出整个 string 字符串。
因为此时传递的是 rbegin() 和 rend(),这个函数调用从 line 的最后一个字符开始往回搜索。当 find 完成时,如果列表中有逗号,那么 rcomma 指向其最后一个逗号,即指向反向搜索找到的第一个逗号。如果没有逗号,则 rcomma 的值为 line.rend()。
会产生假的输出。例如,如果输入是: ????? 图 2 阐明了这个问题:使用反向迭代器时,以逆序从后向前处理 string对象。为了得到正确的输出,必须将反向迭代器 line.rbegin() 和 rcomma 转换为从前向后移动的普通迭代器。其实没必要转换 line.rbegin(),因为我们知道转换的结果必定是 line.end()。只需调用所有反向迭代器类型都提供的成员
假设还是前面给出的输入,该语句将如愿输出 LAST。 ???????? ????????????????????????????????????????图 2. 反向迭代器与普通迭代器之间的区别
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 3:42:30- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |