首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ STL map 容器入門實戰:人名查詢問題完整解析

     編輯:關於C語言

問題描述:人名查詢

給定 n 個人名和 m 個查詢,每個查詢一個人名,輸出該名字是否在前 n 個名字中出現過。
約束:1 ≤ n ≤ 10000, 1 ≤ m ≤ 1000,名字由大小寫字母組成,長度 ≤ 100。

輸入輸出示例

Input:
5 2
ZhangSan
ZhangEr
ZhangYi
LiSi
LiWu
ZhangLiu
LiWu

Output:
NO
YES

核心思路:map 實現 O(1) 平均查找

std::map<string, bool> 內部紅黑樹,查找/插入 O(log n);std::unordered_map 哈希表,平均 O(1)。本題數據量 unordered_map 更優,但 map 亦足夠。

完整代碼實現


#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    if (!(cin >> n >> m)) return 0;

    unordered_map name;  // 或 map
    string tmp;

    for (int i = 0; i < n; ++i) {
        cin >> tmp;
        name[tmp] = true;
    }

    for (int i = 0; i < m; ++i) {
        cin >> tmp;
        if (name.count(tmp))  // 或 name[tmp]
            cout << "YES\n";
        else
            cout << "NO\n";
    }
    return 0;
}

關鍵點解析

1. 兩種讀入方式

  • cin:類型安全、自動處理空白、配合 sync_with_stdio(false) 速度足夠
  • scanf:C 風格,需字符數組緩衝,scanf("%s", buf) 有緩衝區溢出風險

2. map vs unordered_map

3. name[tmp] vs name.count(tmp)

  • name[tmp]:若鍵不存在會插入默認值 (bool 為 false),有副作用
  • name.count(tmp):純查詢,返回 0/1,不修改容器,推薦
  • name.find(tmp) != name.end():等價,可獲取迭代器

4. 字符串處理細節

  • 名字區分大小寫:"ZhangSan" != "zhangsan"
  • 輸入可能含空行:cin >> tmp 自動跳過空白
  • 長度 ≤ 100:string 動態管理無憂

進階擴展

  • 計數:unordered_map cnt; cnt[name]++;
  • 自定義哈希:防哈希攻擊(競賽場景)struct custom_hash { size_t operator()(const string& s) const { ... } };
  • 內存優化:大量短字符串可用 string_view (C++17) 或字符池

總結

STL map/unordered_map 是關聯容器利器。本題核心是去重存儲 + 快速查找,選對容器、用對查詢方法、注意輸入輸出優化,即可輕鬆解決。實戰中根據是否需要有序、數據量、查詢模式在 map/unordered_map/set 間選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性mapunordered_map
底層結構紅黑樹 (RB-Tree)哈希表
查找/插入O(log n)平均 O(1),最壞 O(n)
有序性鍵值有序無序
適用場景需有序遍歷、範圍查詢純查找/計數、大數據量