做淘宝链接的网站,深圳网站托管,哪些网站可以做花店推广,wordpress 自媒体主题目录 
1.概述 
2.容器类 
2.1.序列容器 
2.2.关联容器 
2.3.容器适配器 
2.4.数组 
3.迭代器 
4.重用标准迭代器 
5.总结 1.概述 在之前#xff0c;我们讲了迭代器设计模式#xff0c;分析了它的结构、角色以及优缺点#xff1a; 设计模式之迭代器模式-CSDN博客 在 STL 中我们讲了迭代器设计模式分析了它的结构、角色以及优缺点 设计模式之迭代器模式-CSDN博客 在 STL 中算法通常作为函数模板来实现而数据结构容器则是模板类。这种分离使得算法可以独立于特定的数据结构来编写和使用只要数据结构满足算法所需的接口例如迭代器接口。 STL的中心思想是将算法与数据结构分离彼此独立设计最后在用iterator将他们结合在一起获得最大的适配性。通过“迭代器”接口已经实现了将算法与数据结构分离的目的。 2.容器类 容器类是STL非常重要的一部分它们提供了用于存储、检索和操作数据对象如整数、浮点数、字符串等的模板类。以下是STL中一些主要的容器类 
2.1.序列容器 这些容器中的元素可以看作是线性排列的。 std::vector: 动态数组可以动态地增加和减少元素。 std::deque: 双端队列支持在序列的开头和结尾处快速插入和删除元素。 std::list: 双向链表允许在任何位置进行快速插入和删除操作。 std::forward_list: 单向链表仅支持向前迭代并且在序列的开头进行快速插入和删除操作。 std::array: 固定大小的数组不是动态的但提供了更好的性能。 std::string: 特殊的动态字符数组用于存储字符串。 std::stack: 后入先出(LIFO)的容器适配器通常基于std::deque或std::vector实现。 std::queue: 先入先出(FIFO)的容器适配器通常基于std::deque或std::list实现。 std::initializer_list: 初始化其它容器的容器只是std::initializer_list不存储数据详见 C之std::initializer_list详解_c std initializer-CSDN博客 2.2.关联容器 这些容器中的元素是按键key存储的并且按键进行排序。 std::set: 集合包含唯一的元素按键排序。 std::multiset: 允许包含重复元素的集合。 std::map: 关联数组其中每个元素都是一对键/值对按键排序。 std::multimap: 允许键重复的关联数组。 std::unordered_set: 无序集合包含唯一的元素但不按键排序。 std::unordered_multiset: 允许包含重复元素的无序集合。 std::unordered_map: 无序关联数组其中每个元素都是一对键/值对但不按键排序。 std::unordered_multimap: 允许键重复的无序关联数组。 
2.3.容器适配器 这些类不是容器本身但它们为其他容器类提供了不同的接口。 std::stack: 后入先出(LIFO)的容器适配器。 std::queue: 先入先出(FIFO)的容器适配器。 std::priority_queue: 优先级队列其中元素按优先级排序通常基于堆实现。 
2.4.数组 对于C数组指针扮演迭代器的角色。 
int myInts[100];
std::for_each(myInts, myInts  100, doSomething);严格来说myInts不是指针而是数组但它仍然提供对数组的第一个元素的访问而myInts  100指向“结束后”的地址符合begin-end的语义。 因此C数组可以与算法一起使用在旧代码中非常有帮助。 需要注意的是自C11以来引入了一种新的统一语法使用std::begin和std::end自由函数而不是类方法。它们可以统一地用于任何具有可以无参数调用的begin或end方法的类型并且也可以用于C数组。 下面的代码示例说明了这种统一性 
int myInts[100];
std::vectorint vec(100, 0); // 大小为100且初始化为0std::for_each(std::begin(vec), std::end(vec), doSomething);
std::for_each(std::begin(myInts), std::end(myInts), doSomething); 这使得使用C数组变得更加简单并且对于通用代码非常方便。 需要注意的是对于C数组必须显式地写出std命名空间因为它无法使用ADL但对于vector可以省略std命名空间。 
3.迭代器 
1) 上述序列容器和关联容器都提供了标准的迭代器操作 正向迭代器begin()和end() 反向迭代器rbegin()和rend() 常量正向迭代器cbegin()和cend()或者const容器上的begin()和end() 常量反向迭代器crbegin()和crend()或者const容器上的rbegin()和rend() 
2) 容器迭代器是不提供这些操作的。 
3) 数组可以用std::begin()和std::end()来获取正向迭代器、反向迭代器、常量正向迭代器和常量反向迭代器。 
4.重用标准迭代器 如果集合确实需要领域功能或者只想要标准容器提供的部分功能可能需要定义一个包装标准容器的类。在这种情况下可以使用标准容器的迭代器来实现迭代器 
// 接口
class FlowCollection
{
public:// ...领域接口...// 允许访问数据的迭代器using const_iterator  std::vectorFlow::const_iterator;const_iterator begin() const;const_iterator end() const;// 允许修改数据的迭代器using iterator  std::vectorFlow::iterator;iterator begin();iterator end();// 其他迭代器...private:std::vectorFlow m_flows;// ...领域数据...
};// 实现
FlowCollection::iterator FlowCollection::begin()
{return m_flows.begin();
} 
那么算法就可以这样调用以排序为例 
FlowCollection  data;std::sort(data.begin(), data.end()); 
5.总结 STL 中的算法是一组函数模板它们接受迭代器作为参数并对迭代器范围内的元素执行操作。这些算法包括排序、搜索、复制、删除等操作。由于算法是独立于数据结构的因此它们可以与任何支持迭代器接口的容器一起使用。 通过将算法与容器分离STL 允许程序员根据需要组合不同的算法和容器。例如你可以使用排序算法对向量进行排序或者使用搜索算法在集合中查找元素。这种灵活性使得 STL 能够适应各种不同的应用场景。 总的来说STL 的设计方式通过将算法与数据结构分离实现了代码的可重用性、可维护性和灵活性。这使得 STL 成为 C 程序员在处理数据结构和算法时的重要工具。