笔记
1.字符数组可以用scanf读入
scanf 的 "%s" 格式说明符在读取字符串时,会在遇到第一个空白字符(空格、制表符 \t、换行符 \n)时停止读取。
格式: 使用 scanf("%s", array_name);。
如果输入的字符串长度大于字符数组的空间,那将发生缓冲区溢出(Buffer Overflow)
如何安全地读入字符串?
为了避免缓冲区溢出,你需要限制 scanf 读取的字符数量。
解决方案:在 %s 前指定最大宽度
你可以使用 %Ns 的格式,其中 N 是你希望读取的最大字符数(不包括结尾的空字符 \0)。
2.pair的访问
使用 .(点)操作符来访问 pair 的成员。
your_pair.first:访问第一个元素。
your_pair.second:访问第二个元素。
3.std::queue::front() 不是返回迭代器。
queue.front() 返回的是队列中第一个元素(队首元素)的引用。
作用: 它让你可以直接访问或修改队首的元素,而不会将该元素从队列中移除。
为什么 queue 不使用迭代器?
std::queue 是一个容器适配器,它封装了底层容器(如 deque 或 list)。它的设计目的是提供一个有限的、特定的接口(先进先出 FIFO):push(入队)、pop(出队)、front(访问队首)、back(访问队尾)、size、empty。它故意不提供像 begin() 和 end() 这样的迭代器,以防止用户破坏其 FIFO 的特性(例如,跳过队首元素直接访问后面的元素)。
对比其他容器:
std::vector, std::deque, std::list 等序列容器:既有 front()(返回引用)也有 begin()(返回迭代器)。
std::queue, std::stack, std::priority_queue:这些容器适配器通常只提供 front()/top()(返回引用)等操作,不提供 begin()/end()(迭代器)
4.map和unorder_map的区别是什么?

详细解释:
底层实现与排序:
map 使用平衡二叉搜索树作为其底层数据结构。这种结构在插入和删除时会自动维护树的平衡,并根据键值的比较结果(默认为 <)来组织节点,从而保证了元素始终是有序的。
unordered_map 使用哈希表。它通过一个哈希函数将键映射到桶(bucket)中来存储元素。因此,元素的物理存储位置取决于哈希函数和键本身,它们之间没有固有的顺序。
性能:
map: 由于其有序性是通过树结构维持的,查找、插入和删除操作都需要在树中进行导航(例如,向下找到正确的位置),这个过程的时间复杂度稳定在 O(log N)。这使得它的性能可预测,最坏情况和平均情况差不多。
unordered_map: 理想情况下,哈希函数能将键均匀地分布到各个桶中,这样查找、插入和删除只需要计算一次哈希值并访问对应的桶,时间复杂度为 O(1)。这是其性能优势所在。然而,如果哈希函数不佳导致很多键映射到同一个桶(哈希冲突),那么该桶上的操作就退化为遍历一个链表或类似结构,最坏情况下时间复杂度会达到 O(N)。
应用场景:
当你需要保持元素有序,或者需要进行范围查询(如查找大于某个值的第一个元素)时,map 是首选。例如,需要按字母顺序打印所有键值对,或者维护一个按时间戳排序的事件列表。
当你不需要关心元素顺序,并且希望获得最快的平均查找、插入和删除速度时,unordered_map 通常是更好的选择。例如,用作缓存、去重、或快速查找表等场景。
总而言之,选择 map 还是 unordered_map 主要取决于你是否需要元素的有序性。如果需要,选 map;如果更看重平均性能且不需要排序,选 unordered_map。

浙公网安备 33010602011771号