在哪个网站上做推广作用好,制作网站的心得,wordpress婚庆模板下载,做网站自己买服务器文章目录 C 中的容器分类1. 顺序容器2. 关联容器3. 无序容器4. 容器适配器5. 字符串容器6. 特殊容器 set1.构造函数2.迭代器3.容量相关的成员函数4.修改器类的成员函数5.容器相关操作的成员函数 multiset1.equal_range map1.初始化相关的函数2.迭代器3.容量相关的成员函数4.访问… 文章目录 C 中的容器分类1. 顺序容器2. 关联容器3. 无序容器4. 容器适配器5. 字符串容器6. 特殊容器 set1.构造函数2.迭代器3.容量相关的成员函数4.修改器类的成员函数5.容器相关操作的成员函数 multiset1.equal_range map1.初始化相关的函数2.迭代器3.容量相关的成员函数4.访问相关的成员函数5.修改器类的成员函数6.容器相关操作的成员函数 总结 C 中的容器分类
在C中标准库提供了多种容器这些容器可以根据其数据存储方式和功能进行分类。以下是C中常见容器的分类
1. 顺序容器
这些容器按顺序存储元素适用于需要保持元素顺序的场景。
vector: 动态数组支持快速随机访问和在末尾高效插入和删除操作。deque: 双端队列支持快速随机访问和在两端高效插入和删除操作。list: 双向链表支持在任何位置高效插入和删除操作但随机访问较慢。forward_list: 单向链表只支持在头部高效插入和删除操作。array: 固定大小的数组大小在编译时确定。
2. 关联容器
这些容器根据键值对存储元素并自动按键排序适用于需要快速查找的场景。
set: 集合存储唯一的元素元素自动按键排序。multiset: 允许重复元素的集合元素自动按键排序。map: 键值对存储的映射键唯一且自动排序。multimap: 允许重复键的映射键自动排序。
3. 无序容器
这些容器使用哈希表存储元素适用于需要快速查找和插入的场景但不保证元素顺序。
unordered_set: 无序集合存储唯一的元素。unordered_multiset: 无序多重集合允许重复元素。unordered_map: 无序映射键唯一。unordered_multimap: 无序多重映射允许重复键。
4. 容器适配器
这些不是独立的容器而是对现有容器的包装提供特定用途的接口。
stack: 栈后进先出LIFO结构通常使用deque或vector实现。queue: 队列先进先出FIFO结构通常使用deque或list实现。priority_queue: 优先队列元素按优先级排序通常使用vector和heap算法实现。
5. 字符串容器
string: 用于存储和操作字符序列类似于动态数组但专门针对字符。
6. 特殊容器
bitset: 固定大小的二进制数组提供按位操作。
这些容器各有优缺点和适用场景选择合适的容器可以显著提高程序的性能和可维护性。
这篇文章讲的两个容器都是关联式容器
set 在C标准库中set容器的底层实现通常是基于红黑树这种自平衡二叉搜索树。红黑树是一种能够在插入、删除和查找操作中保持对数时间复杂度的树结构。
1.构造函数 构造函数主要分为三个无参构造迭代器区间构造拷贝构造
无参构造
setint s;迭代器区间构造
vectorint v{ 1,2,3,4,5,6,7 };
setint s(v.begin(), v.end());拷贝构造
setint s1{ 1,2,3,4 };
setint s2(s1);赋值拷贝
setint s1{ 1,2,3,4 };
setint s2;
s2 s1;2.迭代器 迭代器遍历
auto it s1.begin();
while (it ! s1.end())
{cout *it ;it;
}范围for
for (auto e : s1)
{cout e ;
}3.容量相关的成员函数 int main()
{setint s1{ 1,2,3,4 };cout s1.size() endl;//4cout s1.empty() endl;//0return 0;
}4.修改器类的成员函数 insert 有三个重载函数
支持迭代器区间插入。
int main()
{setint s1;s1.insert(2);s1.insert(3);s1.insert(6);s1.insert(1);s1.insert(5);s1.insert(7);for (auto e : s1){cout e ;}return 0;
}erase
第二个重载函数
int num s1.erase(3);
cout endl num endl;删除成功返回1删除失败返回0。
5.容器相关操作的成员函数 find
int main()
{setint s1;s1.insert(2);s1.insert(3);s1.insert(6);s1.insert(1);s1.insert(5);s1.insert(7);auto it s1.find(2);if (it ! s1.end()) cout *it endl;else cout does not exist endl;return 0;
}如果找到了返回找到的迭代器如果没有找到则返回的是end()。 count count返回的是对应元素的个数在set中存在就返回1不存在就返回0。 lower_bound
lower_bound返回的是大于等于某个数的。
int main()
{setint s1;s1.insert(2);s1.insert(3);s1.insert(6);s1.insert(1);s1.insert(5);s1.insert(7);auto lower s1.lower_bound(4);cout *lower endl;return 0;
}这里输出的是大于等于4的数所以这里输出的是5。 upper_bound
auto upper s1.upper_bound(6);
cout *upper endl;这里输出的是大于6的数所以输出的是7。 set有一个致命的缺陷在插入重复数据时是插入不进去的所以这里我们需要了解multiset。
multiset multiset和set唯一不同的区别是一个支持插入重复数据一个不支持。
int main()
{setint s1;s1.insert(1);s1.insert(1);s1.insert(1);s1.insert(1);for (auto e : s1) cout e ;multisetint s2;s2.insert(1);s2.insert(1);s2.insert(1);s2.insert(1);cout endl;for (auto e : s2)cout e ;return 0;
}可以set不支持插入重复数据multiset支持插入重复数据。 在查找数据的时候multiset查找的是第一个数据。 删除数据multiset删除数据删除的是所有重复的数据而不是删除第一个数据。
1.equal_range
int main()
{multisetint s{ 1,1,4,4,4,3,3,3,3,3,5,5,5, 6 };auto [a, b] s.equal_range(3);s.erase(a, b);for (auto e : s){cout e ;}
}equal_range可以求出指定值的范围区域两个迭代器。 一个首一个尾。
map map属于KV模型用一个k值索引v值。 在C标准库中map 容器的底层实现通常是基于红黑树Red-Black Tree这种自平衡二叉搜索树Self-balancing Binary Search Tree。红黑树是一种能够在插入、删除和查找操作中保持对数时间复杂度的树结构。
1.初始化相关的函数 构造函数 map和set的构造方式是一样的也是三种构造函数。
2.迭代器 map的迭代器和set的迭代器稍有区别但不多。
返回for
int main()
{mapint, char m{ { 1,a } ,{ 2,b },{ 3,c },{ 4,d },{ 5,e } };for (auto e : m)cout e.first : e.second endl;
}迭代器区间遍历
int main()
{mapint, char m{ { 1,a } ,{ 2,b },{ 3,c },{ 4,d },{ 5,e } };auto it m.begin();while (it ! m.end()){cout it-first : it-second endl;it;}
}结构化绑定
int main()
{mapint, char m{ { 1,a } ,{ 2,b },{ 3,c },{ 4,d },{ 5,e } };for (auto [a, b] : m)cout a : b endl;
}3.容量相关的成员函数 和set的用法大差不差。
4.访问相关的成员函数 operator[]
int main()
{mapint, char m{ { 1,a } ,{ 2,b },{ 3,c },{ 4,d },{ 5,e } };cout m[1] endl;cout m[2] endl;cout m[3] endl;
}map可以通过一个成员的第一个键值来索引当前成员的第二个键值就是用key索引value。 at
int main()
{mapint, char m{ { 1,a } ,{ 2,b },{ 3,c },{ 4,d },{ 5,e } };cout m.at(1) endl;
}用at进行索引value。 可以看见如果容器当中没有当前值的索引则会抛出异常。
5.修改器类的成员函数 这里修改器类的成员函数和set相同但是insert需要插入一个键值对
m.insert({ 6,f });
m.insert(pairint, char(6, f));
m.insert(make_pair(6, f));6.容器相关操作的成员函数 这些和set都是一样的。
总结
在本篇博客中我们深入探讨了C标准库中的map和set容器。通过详细的示例和解释我们了解了它们的基本用法、常用操作以及在不同场景下的应用。map和set不仅为我们提供了高效的键值对存储和有序集合管理功能还在复杂数据结构和算法设计中扮演了重要角色。
掌握map和set的使用不仅能够提升我们的编程效率还能帮助我们编写出更为高效和可靠的代码。在实际开发中合理地选择和使用这些容器可以显著优化程序的性能和可维护性。
希望通过这篇博客大家能够对map和set有更深入的理解并在以后的编程实践中灵活运用它们。如果你有任何疑问或建议欢迎在评论区留言讨论。