unordered_map使用MFC的CString作為鍵值遇到C2056和C2064錯誤

文章目錄

  • unordered_map使用MFC的CString作為鍵值遇到C2056和C2064錯誤
    • 問題出現的背景
    • 解決方案
    • 總結

unordered_map使用MFC的CString作為鍵值遇到C2056和C2064錯誤

問題出現的背景

在我的一個老工程項目中,使用C++的std::unordered_map時,使用了MFC的CString作為鍵值類型,遇到編譯錯誤C2056和C2064。這些錯誤通常與哈希函數和比較操作符的缺失有關。

此前,項目使用了如下代碼實現CString的哈希函數和比較操作符:

// CString 哈希函數結構體,用于unordered_map
struct CStrHashFunc
{size_t operator()(const CString &str) const{return hash_value(static_cast<LPCTSTR>(str));}
};

代碼是VS2015環境下實現的,然后當項目代碼升級遷移到VS2022時,隨著VC++版本的升級,hash_value這種非標準函數不再可用,參考unordered_map使用std::string作為鍵的辦法,示例代碼如下:

#include <iostream>
#include <string>
#include <unordered_map>int main()
{std::unordered_map<std::string, double> mymap = {{"mom",5.4},{"dad",6.1},{"bro",5.9},{"姐姐",5.5 }};std::string input;std::cout << "who? ";getline(std::cin, input);std::unordered_map<std::string, double>::const_iterator got = mymap.find(input);if (got == mymap.end())std::cout << "not found";elsestd::cout << got->first << " is " << got->second;std::cout << std::endl;return 0;
}

上述代碼以unordered_map的查找為例,使用了std::string作為鍵值類型,并且可以直接使用std::hash<std::string>,不需要額外定義哈希函數。
然而,我們將這種思路放到CString上時,直接使用std::hash<CString>會導致編譯錯誤C2056和C2064,因為標準庫并沒有為MFC的CString提供默認的哈希函數和比較操作符。

error

解決方案

為了解決這個問題,我們需要為CString自定義哈希函數和比較操作符。以下是一個示例代碼,展示了如何實現這一點,該代碼可以在VS2022中編譯通過,且功能正常:

// CString 比較函數結構體,用于unordered_map
struct CStrCmp
{bool operator()(const CString &str1, const CString &str2) const{return str1 == str2;}
};// CString 哈希函數結構體,用于unordered_map
struct CStringHasher
{template <typename BaseType, class StringTraits>size_t operator()(const CStringT<BaseType, StringTraits>& _Keyval) const noexcept{ // hash _Keyval to size_t value by pseudorandomizing transformreturn std::_Hash_array_representation(_Keyval.GetString(), _Keyval.GetLength());}
};// 應用示例:
unordered_map<CString, int, CStringHasher, CStrCmp> m_filemap;
unordered_map<CString, int, CStringHasher, CStrCmp>::const_iterator itr = m_filemap.find(filename);

在上述代碼中,我們定義了兩個結構體:

  1. CStrCmp:用于比較兩個CString對象是否相等,重載了operator()
  2. CStringHasher:用于計算CString的哈希值,重載了operator(),利用了CStringT的成員函數GetString()GetLength()來獲取字符串內容和長度,并調用了標準庫的哈希函數。

當然,我們也可以在namespace std(std命名空間)中定義這哈希和比較運算(事實上這種情況下我們只需要定義哈希,因為這種模式下會默認使用CString自帶的比較運算):

namespace std
{template <typename BaseType, class StringTraits>struct hash<CStringT<BaseType, StringTraits>>{ // hash functor for CStringT<BaseType, StringTraits>size_t operator()(const CStringT<BaseType, StringTraits>& _Keyval) const noexcept{ // hash _Keyval to size_t value by pseudorandomizing transformreturn (_Hash_array_representation(_Keyval.GetString(), _Keyval.GetLength()));}};
} // namespace std

調用示例代碼如下:

std::unordered_map<CString, int> myMap = { {L"acad.lsp", 1}, {L"acaddoc.lsp", 1}, {L"acad.mnl", 2} };
std::unordered_map<CString, int>::const_iterator it = myMap.find(L"acad.lsp");

該代碼編譯和執行均正常。

總結

通過為MFC的CString自定義哈希函數和比較操作符,我們成功解決了在使用std::unordered_map時遇到的編譯錯誤C2056和C2064的問題。這種方法不僅適用于CString,也可以推廣到其他自定義類型,只要為它們提供合適的哈希函數和比較操作符即可。這樣,我們就能充分利用unordered_map的高效查找性能,同時避免編譯錯誤。
然而,CString類??不是線程安全??的。在多線程環境中,如果多個線程同時操作??同一個?? CString實例(例如作為 unordered_map的鍵并進行修改),可能會導致內存地址錯誤或進程異常退出。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922368.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922368.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922368.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Maven 本地倉庫的 settings.xml 文件

本地倉庫目錄位置&#xff1a;C:/用戶/用戶名/.m2/repository 需要修改配置&#xff0c;具體的修改方法請看 ↓↓↓ 2024版 IDEA 用 Maven 創建 java 項目&#xff08;Maven 安裝和配置&#xff09; <?xml version"1.0" encoding"UTF-8"?><!…

vue動畫內置組件

文章目錄vue動畫的官方類名EnterLeaveTransition組件注意事項觸發實例TransitionGroup組件注意事項觸發機制實例拓展vue動畫的官方類名 如下來自vue官方文檔&#xff0c;提供了dom元素&#xff0c;插入Enter和刪除Leave的類名 Enter v-enter-from&#xff1a;進入動畫的起始…

軟考中級信息安全與病毒防護知識點

### 一、核心知識點梳理這部分內容可以大致分為三個方面&#xff1a;**信息安全基本概念**、**加解密技術** 和 **惡意代碼&#xff08;病毒&#xff09;防護**。#### 1. 信息安全的基本目標&#xff08;CIA三元組&#xff09; 這是所有信息安全問題的基石&#xff0c;必須熟練…

數組存儲 · 行主序與列主序 | 應用 / 基地址 / 選擇策略

注&#xff1a;本文為 “數組存儲 行主序與列主序” 相關合輯。 英文引文&#xff0c;機翻未校。 中文引文&#xff0c;略作重排。 未整理去重&#xff0c;如有內容異常&#xff0c;請看原文。 Row major and Column Major Address calculations 按行主序和按列主序的地址計算…

在 CentOS 中安裝 VirtualBox 增強功能的步驟

很好&#xff0c;你看到 /run/media/asfor/VBox_GAs_7.2.2&#xff0c;這說明你已經在 VirtualBox 中掛載了“增強功能&#xff08;Guest Additions&#xff09;”光盤&#xff0c;接下來只要手動安裝就可以啟用共享剪貼板、全屏分辨率、鼠標無縫移動等功能。&#x1f4dd; 在 …

Python快速入門專業版(三十):函數進階:函數嵌套與作用域(內部函數訪問外部變量)

目錄引一、函數嵌套&#xff1a;在函數內部定義函數1. 基本語法與調用方式示例1&#xff1a;簡單的函數嵌套結構2. 嵌套函數的典型應用&#xff1a;隱藏輔助邏輯示例2&#xff1a;用嵌套函數隱藏輔助邏輯二、嵌套函數的作用域&#xff1a;變量訪問規則1. 內部函數訪問外部函數的…

C++數組與字符串:從基礎到實戰技巧

C中的數組和字符串是處理數據集合和文本的基礎工具。數組用于存儲相同類型的元素集合&#xff0c;而字符串則專門用于處理文本數據。C提供了兩種主要的字符串處理方式&#xff1a;C風格字符串&#xff08;字符數組&#xff09;和C的std::string類。 &#x1f4ca; 1. 數組 (Arr…

艾邁斯歐司朗推出首款高功率多芯片激光器封裝

在投影顯示領域掀起技術革新的浪潮中&#xff0c;艾邁斯歐司朗猶如一位技藝精湛的工匠&#xff0c;精心打造出Vegalas Power系列高功率激光二極管的首顆明珠——PLPM7_455QA激光器。這款采用多顆GaN基功率激光器集成封裝的新品&#xff0c;在短脈沖周期內綻放出42W的璀璨光芒&a…

機器視覺中的工業相機接口該如何選擇?

工業相機接口&#xff1a;數據傳輸的“高速公路”&#xff0c;選對了才夠快 在機器視覺系統里&#xff0c;工業相機就像“眼睛”&#xff0c;而接口則是連接“眼睛”與“大腦”&#xff08;后端處理系統&#xff09;的“高速公路”。這條“路”的寬窄、長短、抗干擾能力&#x…

[數據結構——lesson10.2堆排序以及TopK問題]

目錄 前言 學習目標 堆排序 TopK問題&#xff1a; 解法一&#xff1a;建立N個數的堆 解法二&#xff1a;建立K個數的堆&#xff08;最優解&#xff09; 完整代碼 結束語 前言 上節內容我們詳細講解了堆[數據結構——lesson10.堆及堆的調整算法]&#xff0c;接下來我們…

使用HTTPS 服務在瀏覽器端使用攝像頭的方式解析

1.方式1 // vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue import basicSsl from vitejs/plugin-basic-sslexport default defineConfig({plugins: [vue(),basicSsl({name: test,domains: [192.168.15.166, localhost], // 添加您的IPc…

上下文管理器和異步I/O

目錄 一、上下文管理器 1.1 定義 1.2 特點 1.3 適用場景 1.4 具體實現 1.5 具體實例 1.5.1 文件管理器 1.5.2 線程鎖釋放資源 二、異步I/O 2.1 定義 2.2 特點 2.3 實現方式 2.4 適用場景 高并發網絡服務&#xff1a;Web服務器、API服務等需要處理大量并發連接 2…

LabVIEW信號監測與分析

借助 LabVIEW 平臺&#xff0c;生成含正弦波與噪聲的信號&#xff0c;經頻譜分析等處理&#xff0c;結合動態限值判斷信號是否超限&#xff0c;廣泛用于音頻、振動等領域的信號監測&#xff0c;助力高效開展信號分析與質量把控。概念說明系統圍繞信號的生成、處理、分析及監測展…

MySQL數據庫與表的創建、修改及數據操作指南

精選專欄鏈接 &#x1f517; MySQL技術筆記專欄Redis技術筆記專欄大模型搭建專欄Python學習筆記專欄深度學習算法專欄 歡迎訂閱&#xff0c;點贊&#xff0b;關注&#xff0c;每日精進1%&#xff0c;與百萬開發者共攀技術珠峰 更多內容持續更新中&#xff01;希望能給大家帶來…

?new species of flying reptile1 discovered in Scotland?

Pterosaur: new species of flying reptile1 discovered in Scotland 蘇格蘭斯凱島發現新翼龍物種 考古學家們在蘇格蘭斯凱島發現了一個新的翼龍物種。這種獨特的飛行爬行動物生活在1.68 – 1.66億年前。 This flying reptile soared over the heads of dinosaurs2 when Scotla…

03 節點行為

審批流程圖如下圖&#xff0c;在此流程圖中&#xff0c;存在兩個UserTask節點&#xff0c;第一個節點是主管審批&#xff0c;第二個節點是產品經理審批&#xff0c;兩個節點中間有一個排他網關&#xff0c;此網關用來對主管審批的結果進行判斷&#xff0c;如果主管審批通過&…

深度卷積生成對抗網絡詳解與實現

深度卷積生成對抗網絡詳解與實現 0. 前言 1. 網絡架構 1.1 批歸一化 1.2 激活 1.3 上采樣 2. 構建 DCGAN 2.1 生成器 2.2 判別器 2.3 訓練 DCGAN 0. 前言 深度卷積生成對抗網絡 (Deep Convolutional Generative Adversarial Network, DCGAN) 是基于生成對抗網絡 (Generative A…

CF607B Zuma -提高+/省選-

CF607B Zuma codeforces 原鏈接 題目描述 Genos\texttt{Genos}Genos 最近在他的手機上下載了祖瑪游戲。在祖瑪游戲里&#xff0c;存在 nnn 個一行的寶石&#xff0c;第 iii 個寶石的顏色是 CiC_iCi?。這個游戲的目標是盡快的消滅一行中所有的寶石。 在一秒鐘&#xff0c;Ge…

拆分了解HashMap的數據結構

文章目錄 前言 一、底層數據結構總覽 二、核心組成部分詳解 1. 數組&#xff08;哈希表&#xff09; 2. 節點&#xff08;Node&#xff09; 3. 紅黑樹&#xff08;TreeNode&#xff09; 三、哈希函數與索引計算 四、哈希沖突的解決 五、擴容機制 六、關鍵特性與注意事…

關于電腦連接不到5g的WiFi時的一些解決辦法

方法一、設備管理器重卸載驅動后&#xff0c;重裝驅動。方法二、打開控制面板 “控制面板\網絡和 Internet\網絡連接” &#xff08;親測有效&#xff09;點擊更改適配器配置右擊當前的WLAN屬性點擊配置選擇“高級” 802.11a/b/g 無線模式選項欄 值&#xff1a;6.的雙…